docs/Writerside/topics/buffer.h.md

Thu, 27 Mar 2025 18:24:09 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 27 Mar 2025 18:24:09 +0100
changeset 1264
8ff604356af7
parent 1263
f993745c60f0
child 1269
e15ca477d448
permissions
-rw-r--r--

document buffer create/init

relates to #451

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,
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
6 or from a file or network streams 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,
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
9 automatic resizing of the buffer space, or automatic flushing of contents.
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()`.
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
13 However, due to the different pointer type, the function pointers do not type check out of the box.
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
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
18 <warning>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
19 TODO: add example
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
20 </warning>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
21
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
22 ## Create
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
23
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
24 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
25 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
26
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
27 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
28 const CxAllocator *allocator, int flags);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
29
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
30 CxBuffer *cxBufferCreate(void *space,size_t capacity,
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
31 const CxAllocator *allocator, int flags);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
32
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
33 // available flags:
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
34 #define CX_BUFFER_DEFAULT
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
35 #define CX_BUFFER_FREE_CONTENTS
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
36 #define CX_BUFFER_AUTO_EXTEND
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
37 #define CX_BUFFER_COPY_ON_WRITE
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
38 #define CX_BUFFER_COPY_ON_EXTEND
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
39 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
40
1264
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff changeset
41 For creating a UCX buffer you have two options: initialize a pre-allocated structure, or allocate and initialize a new structure in one call.
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff changeset
42
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff changeset
43 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
44 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
45 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
46
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff changeset
47 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
48
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff changeset
49 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
50
8ff604356af7 document buffer create/init
Mike Becker <universe@uap-core.de>
parents: 1263
diff changeset
51 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
52
1263
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff changeset
53 | Flag | Description |
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff changeset
54 |--------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff changeset
55 | 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
56 | 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
57 | 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
58 | 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
59 | 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
60
f993745c60f0 document the buffer flags
Mike Becker <universe@uap-core.de>
parents: 1262
diff changeset
61
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
62 ## Destroy
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 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
65 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
66
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
67 void cxBufferDestroy(CxBuffer *buffer);
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 void cxBufferFree(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
70 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
71
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
72 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
73
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
74 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
75 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
76 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
77
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
78 ## Write
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
79
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
80 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
81 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
82
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
83 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
84 CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
85
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
86 size_t cxBufferAppend(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
87 CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
88
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
89 int cxBufferPut(CxBuffer *buffer, int c);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
90
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
91 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
92
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
93 int cxBufferTerminate(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
94
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
95 int cxBufferMinimumCapacity(CxBuffer *buffer, size_t capacity);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
96 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
97
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
98 <warning>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
99 TODO: document
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
100 </warning>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
101
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
102 ## Read
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
103
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
104 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
105 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
106
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
107 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
108 CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
109
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
110 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
111
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
112 bool cxBufferEof(const CxBuffer *buffer);
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
113 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
114
1262
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
115 The function `cxBufferRead()` reads `nitems` number of items of `size` bytes each from the `buffer`
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
116 and stores them into the memory pointed to by `ptr`, which must be sufficiently large to hold the contents.
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
117 The function returns the actual bytes read, which might be lower, if the desired number of items is not available.
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
118
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
119 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
120 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
121
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
122 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
123
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
124 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
125
7cc81244b28a document buffer read operations
Mike Becker <universe@uap-core.de>
parents: 1261
diff changeset
126 > 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
127 > 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
128
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
129 ## Reset and Clear
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
130
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
131 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
132 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
133
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
134 void cxBufferReset(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
135
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
136 void cxBufferClear(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
137 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
138
1261
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
139 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
140 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
141
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
142 > When clearing the buffer, only the "live" data, i.e. bytes with indices `[0..size)`, are cleared.
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
143 > If you which to clear the entire buffer's memory, you would need to set the size to the capacity, first.
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
144
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
145 > 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
146 > because writing to the contents is disallowed.
6bbc308b7a20 add documentation for reset and clear
Mike Becker <universe@uap-core.de>
parents: 1260
diff changeset
147 >{style="note"}
1256
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
148
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
149 ## Random Access
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
150
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
151 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
152 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
153
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
154 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
155 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
156
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
157 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
158 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
159 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
160
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
161 If the resulting position is negative, or larger than the size (i.e. the first unused byte),
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
162 this function returns non-zero and sets `errno` to `EOVERFLOW`.
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
163
7bc999fe285d more documentation for buffer.h + set errno in cxBufferSeek() on invalid whence argument
Mike Becker <universe@uap-core.de>
parents: 1256
diff changeset
164 > Note that the error behavior of `cxBufferSeek()` 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
165
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
166 ## Shift Contents
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 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
169 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
170
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
171 int cxBufferShift(CxBuffer *buffer, off_t shift);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
172
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
173 int cxBufferShiftRight(CxBuffer *buffer, size_t shift);
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 int cxBufferShiftLeft(CxBuffer *buffer, size_t shift);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
176 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
177
1260
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
178 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
179 where a negative offset means a shift to the left, and a positive offset means a shift to the right.
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
180 It also adjusts the current position within the buffer, and in case of a right shift also the size, by the same offset.
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
181
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
182 Data that is shift to the left, is always discarded when the new position of a byte would be smaller than zero.
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
183 If the new position would be smaller than zero, it is set exactly to zero.
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
184
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
185 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
186 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
187 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
188 (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
189
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
190 The functions `cxBufferShiftRight()` and `cxBufferShiftLeft()` accept a larger (but in both cases positive) shift offset,
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
191 which usually does not make much sense on a 64-bit platform where `off_t` is already large enough to represent any reasonable offset.
56a019cdb055 add documentation for the shift functions
Mike Becker <universe@uap-core.de>
parents: 1259
diff changeset
192 You may, however, still use those function 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
193
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
194 ## Flushing
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
195
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
196 ```C
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
197 #include <cx/buffer.h>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
198
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
199 typedef struct cx_buffer_flush_config_s {
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
200 size_t threshold;
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
201 size_t blksize;
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
202 size_t blkmax;
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
203 void *target;
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
204 cx_write_func wfunc;
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
205 } CxBufferFlushConfig;
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
206
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
207 int cxBufferEnableFlushing(CxBuffer *buffer,
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
208 CxBufferFlushConfig config);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
209
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
210 size_t cxBufferFlush(CxBuffer *buffer);
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
211 ```
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
212
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
213 <warning>
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
214 TODO: document
b9a940779877 define structure for buffer.h doc
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
215 </warning>
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
216
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
217 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
218 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
219 <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
220 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
221 </seealso>

mercurial