src/cx/buffer.h

Sun, 23 Nov 2025 13:15:19 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Nov 2025 13:15:19 +0100
changeset 1508
dfc0ddd9571e
parent 1426
3a89b31f0724
permissions
-rw-r--r--

optimize sorted insertion by using the infimum instead of the supremum

The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.

483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 /**
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
30 * @file buffer.h
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
32 * @brief Advanced buffer implementation.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 * Instances of CxBuffer can be used to read from or to write to like one
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35 * would do with a stream.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 * Some features for convenient use of the buffer
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 * can be enabled. See the documentation of the macro constants for more
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 * information.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
41 * @author Mike Becker
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
42 * @author Olaf Wintermann
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
43 * @copyright 2-Clause BSD License
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 #ifndef UCX_BUFFER_H
484
9e6900b1cf9d add common.h include to all other header files
Mike Becker <universe@uap-core.de>
parents: 483
diff changeset
47 #define UCX_BUFFER_H
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48
484
9e6900b1cf9d add common.h include to all other header files
Mike Becker <universe@uap-core.de>
parents: 483
diff changeset
49 #include "common.h"
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
50 #include "allocator.h"
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
52 #ifdef __cplusplus
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 extern "C" {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 #endif
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 * No buffer features enabled (all flags cleared).
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 #define CX_BUFFER_DEFAULT 0x00
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 * If this flag is enabled, the buffer will automatically free its contents when destroyed.
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
63 *
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
64 * Do NOT set this flag together with #CX_BUFFER_COPY_ON_WRITE. It will be automatically
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
65 * set when the copy-on-write operation is performed.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 #define CX_BUFFER_FREE_CONTENTS 0x01
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 /**
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
70 * If this flag is enabled, the buffer will automatically extend its capacity.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 #define CX_BUFFER_AUTO_EXTEND 0x02
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
74 /**
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
75 * If this flag is enabled, the buffer will allocate new memory when written to.
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
76 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
77 * The current contents of the buffer will be copied to the new memory, and the flag
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
78 * will be cleared while the #CX_BUFFER_FREE_CONTENTS flag will be set automatically.
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
79 */
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
80 #define CX_BUFFER_COPY_ON_WRITE 0x04
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
81
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
82 /**
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
83 * If this flag is enabled, the buffer will copy its contents to a new memory area on reallocation.
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
84 *
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
85 * After performing the copy, the flag is automatically cleared.
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
86 * This flag has no effect on buffers which do not have #CX_BUFFER_AUTO_EXTEND set, which is why
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
87 * buffers automatically admit the auto-extend flag when initialized with copy-on-extend enabled.
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
88 */
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
89 #define CX_BUFFER_COPY_ON_EXTEND 0x08
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
90
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
91 /**
1112
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
92 * Function pointer for cxBufferWrite that is compatible with cx_write_func.
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
93 * @see cx_write_func
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
94 */
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
95 #define cxBufferWriteFunc ((cx_write_func) cxBufferWrite)
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
96 /**
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
97 * Function pointer for cxBufferRead that is compatible with cx_read_func.
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
98 * @see cx_read_func
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
99 */
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
100 #define cxBufferReadFunc ((cx_read_func) cxBufferRead)
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
101
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1110
diff changeset
102 /**
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
103 * Configuration for automatic flushing.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
104 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
105 struct cx_buffer_flush_config_s {
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
106 /**
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
107 * The buffer may not extend beyond this threshold before starting to flush.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
108 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
109 * Only used when the buffer uses #CX_BUFFER_AUTO_EXTEND.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
110 * The threshold will be the maximum capacity the buffer is extended to
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
111 * before flushing.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
112 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
113 size_t threshold;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
114 /**
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
115 * The block size for the elements to flush.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
116 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
117 size_t blksize;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
118 /**
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
119 * The maximum number of blocks to flush in one cycle.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
120 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
121 * @attention while it is guaranteed that cxBufferFlush() will not flush
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
122 * more blocks, this is not necessarily the case for cxBufferWrite().
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
123 * After performing a flush cycle, cxBufferWrite() will retry the write
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
124 * operation and potentially trigger another flush cycle, until the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
125 * flush target accepts no more data.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
126 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
127 size_t blkmax;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
128
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
129 /**
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
130 * The target for the write function.
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
131 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
132 void *target;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
133
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
134 /**
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
135 * The write-function used for flushing.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
136 * If NULL, the flushed content gets discarded.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
137 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
138 cx_write_func wfunc;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
139 };
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
140
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
141 /**
1181
183bf43aa9b9 fix some typos - issue #548
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1180
diff changeset
142 * Type alias for the flush configuration struct.
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
143 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
144 * @code
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
145 * struct cx_buffer_flush_config_s {
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
146 * size_t threshold;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
147 * size_t blksize;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
148 * size_t blkmax;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
149 * void *target;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
150 * cx_write_func wfunc;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
151 * };
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
152 * @endcode
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
153 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
154 typedef struct cx_buffer_flush_config_s CxBufferFlushConfig;
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
155
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
156 /** Structure for the UCX buffer data. */
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
157 struct cx_buffer_s {
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
158 /** A pointer to the buffer contents. */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
159 union {
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
160 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161 * Data is interpreted as text.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
162 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163 char *space;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
164 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
165 * Data is interpreted as binary.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
167 unsigned char *bytes;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
168 };
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
169 /** The allocator to use for automatic memory management. */
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 761
diff changeset
170 const CxAllocator *allocator;
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
171 /**
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
172 * Optional flush configuration
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
173 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
174 * @see cxBufferEnableFlushing()
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
175 */
1181
183bf43aa9b9 fix some typos - issue #548
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1180
diff changeset
176 CxBufferFlushConfig *flush;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
177 /** Current position of the buffer. */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
178 size_t pos;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
179 /** Current capacity (i.e. maximum size) of the buffer. */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
180 size_t capacity;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
181 /** Current size of the buffer content. */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
182 size_t size;
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
183 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
184 * Flag register for buffer features.
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
185 * @see #CX_BUFFER_DEFAULT
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
186 * @see #CX_BUFFER_FREE_CONTENTS
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
187 * @see #CX_BUFFER_AUTO_EXTEND
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
188 * @see #CX_BUFFER_COPY_ON_WRITE
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
189 */
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
190 int flags;
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
191 };
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
192
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
193 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
194 * UCX buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
195 */
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
196 typedef struct cx_buffer_s CxBuffer;
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
197
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
198 /**
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
199 * Initializes a fresh buffer.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
200 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
201 * You may also provide a read-only @p space, in which case
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
202 * you will need to cast the pointer, and you should set the
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
203 * #CX_BUFFER_COPY_ON_WRITE flag.
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
204 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
205 * You need to set the size manually after initialization if
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
206 * you provide @p space which already contains data.
1029
c065d196a2c8 add advice to set the size of a buffer initialized with existing data
Mike Becker <universe@uap-core.de>
parents: 1028
diff changeset
207 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
208 * When you specify stack memory as @p space and decide to use
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
209 * the auto-extension feature, you @em must use the
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
210 * #CX_BUFFER_COPY_ON_EXTEND flag, instead of the
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
211 * #CX_BUFFER_AUTO_EXTEND flag.
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
212 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
213 * @note You may provide @c NULL as the argument for @p space.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
214 * Then this function will allocate the space and enforce
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
215 * the #CX_BUFFER_FREE_CONTENTS flag. In that case, specifying
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
216 * copy-on-write should be avoided, because the allocated
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
217 * space will be leaking after the copy-on-write operation.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
218 *
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
219 * @param buffer the buffer to initialize
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
220 * @param space pointer to the memory area, or @c NULL to allocate
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
221 * new memory
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
222 * @param capacity the capacity of the buffer
673
60fb6aec157d make allocator in cxBufferInit optional
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
223 * @param allocator the allocator this buffer shall use for automatic
989
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
224 * memory management
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
225 * (if @c NULL, the cxDefaultAllocator will be used)
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
226 * @param flags buffer features (see cx_buffer_s.flags)
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
227 * @return zero on success, non-zero if a required allocation failed
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
228 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
229 cx_attr_nonnull_arg(1)
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
230 CX_EXPORT int cxBufferInit(CxBuffer *buffer, void *space, size_t capacity,
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
231 const CxAllocator *allocator, int flags);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
232
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
233 /**
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
234 * Configures the buffer for flushing.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
235 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
236 * Flushing can happen automatically when data is written
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
237 * to the buffer (see cxBufferWrite()) or manually when
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
238 * cxBufferFlush() is called.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
239 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
240 * @param buffer the buffer
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
241 * @param config the flush configuration
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
242 * @retval zero success
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
243 * @retval non-zero failure
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
244 * @see cxBufferFlush()
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
245 * @see cxBufferWrite()
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
246 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
247 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
248 CX_EXPORT int cxBufferEnableFlushing(CxBuffer *buffer, CxBufferFlushConfig config);
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
249
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
250 /**
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
251 * Destroys the buffer contents.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
252 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
253 * Has no effect if the #CX_BUFFER_FREE_CONTENTS feature is not enabled.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
254 * If you want to free the memory of the entire buffer, use cxBufferFree().
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
255 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
256 * @param buffer the buffer which contents shall be destroyed
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
257 * @see cxBufferInit()
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
258 */
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
259 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
260 CX_EXPORT void cxBufferDestroy(CxBuffer *buffer);
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
261
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
262 /**
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
263 * Deallocates the buffer.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
264 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
265 * If the #CX_BUFFER_FREE_CONTENTS feature is enabled, this function also destroys
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
266 * the contents. If you @em only want to destroy the contents, use cxBufferDestroy().
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
267 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
268 * @param buffer the buffer to deallocate
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
269 * @see cxBufferCreate()
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
270 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
271 CX_EXPORT void cxBufferFree(CxBuffer *buffer);
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
272
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
273 /**
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
274 * Allocates and initializes a fresh buffer.
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
275 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
276 * You may also provide a read-only @p space, in which case
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
277 * you will need to cast the pointer, and you should set the
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
278 * #CX_BUFFER_COPY_ON_WRITE flag.
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
279 * When you specify stack memory as @p space and decide to use
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
280 * the auto-extension feature, you @em must use the
1028
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
281 * #CX_BUFFER_COPY_ON_EXTEND flag, instead of the
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1018
diff changeset
282 * #CX_BUFFER_AUTO_EXTEND flag.
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
283 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
284 * @note You may provide @c NULL as the argument for @p space.
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
285 * Then this function will allocate the space and enforce
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
286 * the #CX_BUFFER_FREE_CONTENTS flag.
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
287 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
288 * @param space pointer to the memory area, or @c NULL to allocate
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
289 * new memory
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
290 * @param capacity the capacity of the buffer
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
291 * @param allocator the allocator to use for allocating the structure and the automatic
989
8aa57a7fecc4 improve consistency for allocator arguments - fixes #485
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
292 * memory management within the buffer
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
293 * (if @c NULL, the cxDefaultAllocator will be used)
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
294 * @param flags buffer features (see cx_buffer_s.flags)
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
295 * @return a pointer to the buffer on success, @c NULL if a required allocation failed
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
296 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
297 cx_attr_malloc cx_attr_dealloc(cxBufferFree, 1) cx_attr_nodiscard
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
298 CX_EXPORT CxBuffer *cxBufferCreate(void *space, size_t capacity,
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
299 const CxAllocator *allocator, int flags);
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
300
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
301 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
302 * Shifts the contents of the buffer by the given offset.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
303 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
304 * If the offset is positive, the contents are shifted to the right.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
305 * If auto extension is enabled, the buffer grows, if necessary.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
306 * In case the auto extension fails, this function returns a non-zero value and
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
307 * no contents are changed.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
308 * When the auto extension is disabled, the contents that do not fit into the
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
309 * buffer are discarded.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
310 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
311 * If the offset is negative, the contents are shifted to the left where the
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
312 * first @p shift bytes are discarded.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
313 * The new size of the buffer is the old size minus the absolute shift value.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
314 * If this value is larger than the buffer size, the buffer is emptied (but
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
315 * not cleared, see the security note below).
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
316 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
317 * The buffer position gets shifted alongside the content but is kept
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
318 * within the boundaries of the buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
319 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
320 * @note For situations where @c off_t is not large enough, there are specialized cxBufferShiftLeft() and
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
321 * cxBufferShiftRight() functions using a @c size_t as the parameter type.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
322 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
323 * @attention
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
324 * Security Note: The shifting operation does @em not erase the previously occupied memory cells.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
325 * But you can do that manually by calling
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
326 * <code>memset(buffer->bytes, 0, shift)</code> for a right shift or
531
1b8624c8448e fix erroneous doc for cxBufferShift
Mike Becker <universe@uap-core.de>
parents: 530
diff changeset
327 * <code>memset(buffer->bytes + buffer->size, 0, buffer->capacity - buffer->size)</code>
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
328 * for a left shift.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
329 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
330 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
331 * @param shift the shift offset (negative means left shift)
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
332 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
333 * @retval non-zero if a required auto-extension or copy-on-write fails
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
334 * @see cxBufferShiftLeft()
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
335 * @see cxBufferShiftRight()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
336 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
337 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
338 CX_EXPORT int cxBufferShift(CxBuffer *buffer, off_t shift);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
339
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
340 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
341 * Shifts the buffer to the right.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
342 * See cxBufferShift() for details.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
343 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
344 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
345 * @param shift the shift offset
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
346 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
347 * @retval non-zero if a required auto-extension or copy-on-write fails
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
348 * @see cxBufferShift()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
349 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
350 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
351 CX_EXPORT int cxBufferShiftRight(CxBuffer *buffer, size_t shift);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
352
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
353 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
354 * Shifts the buffer to the left.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
355 * See cxBufferShift() for details.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
356 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
357 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
358 * @param shift the positive shift offset
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
359 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
360 * @retval non-zero if the buffer uses copy-on-write and the allocation fails
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
361 * @see cxBufferShift()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
362 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
363 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
364 CX_EXPORT int cxBufferShiftLeft(CxBuffer *buffer, size_t shift);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
365
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
366
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
367 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
368 * Moves the position of the buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
369 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
370 * The new position is relative to the @p whence argument.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
371 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
372 * @li @c SEEK_SET marks the start of the buffer.
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
373 * @li @c SEEK_CUR marks the current position.
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
374 * @li @c SEEK_END marks the end of the buffer.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
375 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
376 * With an offset of zero, this function sets the buffer position to zero
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
377 * (@c SEEK_SET), the buffer size (@c SEEK_END) or leaves the buffer position
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
378 * unchanged (@c SEEK_CUR).
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
379 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
380 * @param buffer the buffer
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
381 * @param offset position offset relative to @p whence
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
382 * @param whence one of @c SEEK_SET, @c SEEK_CUR or @c SEEK_END
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
383 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
384 * @retval non-zero if the position is invalid
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
385 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
386 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
387 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
388 CX_EXPORT int cxBufferSeek(CxBuffer *buffer, off_t offset, int whence);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
389
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
390 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
391 * Clears the buffer by resetting the position and deleting the data.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
392 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
393 * The data is deleted by zeroing it with a call to memset().
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
394 * If you do not need that, you can use the faster cxBufferReset().
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
395 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
396 * @note If the #CX_BUFFER_COPY_ON_WRITE flag is set, this function
1018
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
397 * will not erase the data and behave exactly as cxBufferReset().
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
398 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
399 * @param buffer the buffer to be cleared
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
400 * @see cxBufferReset()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
401 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
402 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
403 CX_EXPORT void cxBufferClear(CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
404
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
405 /**
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
406 * Resets the buffer by resetting the position and size to zero.
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
407 *
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
408 * The data in the buffer is not deleted. If you need a safe
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
409 * reset of the buffer, use cxBufferClear().
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
410 *
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
411 * @param buffer the buffer to be cleared
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
412 * @see cxBufferClear()
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
413 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
414 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
415 CX_EXPORT void cxBufferReset(CxBuffer *buffer);
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
416
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
417 /**
757
49ceea78fce7 fix incorrect documentation of cxBufferEof()
Mike Becker <universe@uap-core.de>
parents: 683
diff changeset
418 * Tests, if the buffer position has exceeded the buffer size.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
419 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
420 * @param buffer the buffer to test
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
421 * @retval true if the current buffer position has exceeded the last
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
422 * byte of the buffer's contents
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
423 * @retval false otherwise
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
424 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
425 cx_attr_nonnull cx_attr_nodiscard
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
426 CX_EXPORT bool cxBufferEof(const CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
427
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
428
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
429 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
430 * Ensures that the buffer has a minimum capacity.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
431 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
432 * If the current capacity is not sufficient, the buffer will be extended.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
433 *
1291
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
434 * The new 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: 1290
diff changeset
435 * Then, the new capacity will be a multiple of the page size.
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
436 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
437 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
438 * @param capacity the minimum required capacity for this buffer
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
439 * @retval zero the capacity was already sufficient or successfully increased
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
440 * @retval non-zero on allocation failure
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
441 * @see cxBufferShrink()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
442 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
443 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
444 CX_EXPORT int cxBufferMinimumCapacity(CxBuffer *buffer, size_t capacity);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
445
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
446 /**
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
447 * Shrinks the capacity of the buffer to fit its current size.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
448 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
449 * If @p reserve is larger than zero, the buffer is shrunk to its size plus
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
450 * the number of reserved bytes.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
451 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
452 * If the current capacity is not larger than the size plus the reserved bytes,
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
453 * nothing happens.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
454 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
455 * If the #CX_BUFFER_COPY_ON_WRITE or #CX_BUFFER_COPY_ON_EXTEND flag is set,
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
456 * this function does nothing.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
457 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
458 * @param buffer the buffer
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
459 * @param reserve the number of bytes that shall remain reserved
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
460 * @see cxBufferMinimumCapacity()
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
461 */
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
462 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
463 CX_EXPORT void cxBufferShrink(CxBuffer *buffer, size_t reserve);
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
464
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
465 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
466 * Writes data to a CxBuffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
467 *
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
468 * If automatic flushing is not enabled, the data is simply written into the
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
469 * buffer at the current position, and the position of the buffer is increased
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
470 * by the number of bytes written.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
471 *
567
f90a7cfe2480 #184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents: 545
diff changeset
472 * If flushing is enabled and the buffer needs to flush, the data is flushed to
f90a7cfe2480 #184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents: 545
diff changeset
473 * the target until the target signals that it cannot take more data by
f90a7cfe2480 #184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents: 545
diff changeset
474 * returning zero via the respective write function. In that case, the remaining
f90a7cfe2480 #184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents: 545
diff changeset
475 * data in this buffer is shifted to the beginning of this buffer so that the
1129
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
476 * newly available space can be used to append as much data as possible.
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
477 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
478 * This function only stops writing more elements when the flush target and this
567
f90a7cfe2480 #184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents: 545
diff changeset
479 * buffer are both incapable of taking more data or all data has been written.
1129
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
480 *
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
481 * If, after flushing, the number of items that shall be written still exceeds
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
482 * the capacity or flush threshold, this function tries to write all items directly
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
483 * to the flush target, if possible.
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
484 *
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
485 * The number returned by this function is the number of elements from
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
486 * @c ptr that could be written to either the flush target or the buffer.
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
487 * That means it does @em not include the number of items that were already in
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
488 * the buffer and were also flushed during the process.
1129
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
489 *
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
490 * @attention
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
491 * When @p size is larger than one and the contents of the buffer are not aligned
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
492 * with @p size, flushing stops after all complete items have been flushed, leaving
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
493 * the misaligned part in the buffer.
1135
f79415d974d3 add test case for flushing when target is full and fixes a bug related to that
Mike Becker <universe@uap-core.de>
parents: 1129
diff changeset
494 * Afterward, this function only writes as many items as possible to the buffer.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
495 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
496 * @note The signature is compatible with the fwrite() family of functions.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
497 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
498 * @param ptr a pointer to the memory area containing the bytes to be written
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
499 * @param size the length of one element
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
500 * @param nitems the element count
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
501 * @param buffer the CxBuffer to write to
537
16219eba3a0a fix doc error for cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 531
diff changeset
502 * @return the total count of elements written
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
503 * @see cxBufferAppend()
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
504 * @see cxBufferRead()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
505 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
506 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
507 CX_EXPORT size_t cxBufferWrite(const void *ptr, size_t size,
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
508 size_t nitems, CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
509
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
510 /**
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
511 * Appends data to a CxBuffer.
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
512 *
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
513 * The data is always appended to current data within the buffer,
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
514 * regardless of the current position.
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
515 * This is especially useful when the buffer is primarily meant for reading
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
516 * while additional data is added to the buffer occasionally.
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
517 * Consequently, the position of the buffer is unchanged after this operation.
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
518 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
519 * @note The signature is compatible with the fwrite() family of functions.
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
520 *
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
521 * @param ptr a pointer to the memory area containing the bytes to be written
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
522 * @param size the length of one element
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
523 * @param nitems the element count
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
524 * @param buffer the CxBuffer to write to
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
525 * @return the total count of elements written
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
526 * @see cxBufferWrite()
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
527 * @see cxBufferRead()
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
528 */
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
529 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
530 CX_EXPORT size_t cxBufferAppend(const void *ptr, size_t size,
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
531 size_t nitems, CxBuffer *buffer);
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
532
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
533 /**
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
534 * Performs a single flush-run on the specified buffer.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
535 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
536 * Does nothing when the position in the buffer is zero.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
537 * Otherwise, the data until the current position minus
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
538 * one is considered for flushing.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
539 * Note carefully that flushing will never exceed the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
540 * current @em position, even when the size of the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
541 * buffer is larger than the current position.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
542 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
543 * One flush run will try to flush @c blkmax many
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
544 * blocks of size @c blksize until either the @p buffer
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
545 * has no more data to flush or the write function
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
546 * used for flushing returns zero.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
547 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
548 * The buffer is shifted left for that many bytes
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
549 * the flush operation has successfully flushed.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
550 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
551 * @par Example 1
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
552 * Assume you have a buffer with size 340 and you are
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
553 * at position 200. The flush configuration is
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
554 * @c blkmax=4 and @c blksize=64 .
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
555 * Assume that the entire flush operation is successful.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
556 * All 200 bytes on the left-hand-side from the current
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
557 * position are written.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
558 * That means the size of the buffer is now 140 and the
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
559 * position is zero.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
560 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
561 * @par Example 2
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
562 * Same as Example 1, but now the @c blkmax is 1.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
563 * The size of the buffer is now 276, and the position is 136.
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
564 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
565 * @par Example 3
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
566 * Same as Example 1, but now assume the flush target
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
567 * only accepts 100 bytes before returning zero.
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
568 * That means the flush operation manages to flush
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
569 * one complete block and one partial block, ending
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
570 * up with a buffer with size 240 and position 100.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
571 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
572 * @remark Just returns zero when flushing was not enabled with
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
573 * cxBufferEnableFlushing().
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
574 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
575 * @remark When the buffer uses copy-on-write, the memory
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
576 * is copied first, before attempting any flush.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
577 * This is, however, considered an erroneous use of the
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
578 * buffer because it makes little sense to put
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
579 * readonly data into an UCX buffer for flushing instead
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
580 * of writing it directly to the target.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
581 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
582 * @param buffer the buffer
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
583 * @return the number of successfully flushed bytes
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
584 * @see cxBufferEnableFlushing()
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
585 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
586 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
587 CX_EXPORT size_t cxBufferFlush(CxBuffer *buffer);
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
588
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
589 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
590 * Reads data from a CxBuffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
591 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
592 * The position of the buffer is increased by the number of bytes read.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
593 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
594 * @note The signature is compatible with the fread() family of functions.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
595 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
596 * @param ptr a pointer to the memory area where to store the read data
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
597 * @param size the length of one element
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
598 * @param nitems the element count
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
599 * @param buffer the CxBuffer to read from
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
600 * @return the total number of elements read
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
601 * @see cxBufferWrite()
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
602 * @see cxBufferAppend()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
603 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
604 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
605 CX_EXPORT size_t cxBufferRead(void *ptr, size_t size,
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
606 size_t nitems, CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
607
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
608 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
609 * Writes a character to a buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
610 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
611 * The least significant byte of the argument is written to the buffer. If the
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
612 * end of the buffer is reached and #CX_BUFFER_AUTO_EXTEND feature is enabled,
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
613 * the buffer capacity is extended by cxBufferMinimumCapacity(). If the feature
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
614 * is disabled or the buffer extension fails, @c EOF is returned.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
615 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
616 * On successful writing, the position of the buffer is increased.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
617 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
618 * If you just want to write a null-terminator at the current position, you
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
619 * should use cxBufferTerminate() instead.
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
620 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
621 * @param buffer the buffer to write to
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
622 * @param c the character to write
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
623 * @return the byte that has been written or @c EOF when the end of the stream is
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
624 * reached, and automatic extension is not enabled or not possible
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
625 * @see cxBufferTerminate()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
626 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
627 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
628 CX_EXPORT int cxBufferPut(CxBuffer *buffer, int c);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
629
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
630 /**
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
631 * Writes a terminating zero to a buffer at the current position.
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
632 *
1284
b2103354baed fix implementation of cxBufferTerminate() - fixes #631
Mike Becker <universe@uap-core.de>
parents: 1181
diff changeset
633 * If successful, sets the size to the current position and advances the position by one.
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
634 *
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
635 * The purpose of this function is to have the written data ready to be used as
1284
b2103354baed fix implementation of cxBufferTerminate() - fixes #631
Mike Becker <universe@uap-core.de>
parents: 1181
diff changeset
636 * a C string with the buffer's size being the length of that string.
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
637 *
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
638 * @param buffer the buffer to write to
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
639 * @return zero, if the terminator could be written, non-zero otherwise
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
640 */
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
641 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
642 CX_EXPORT int cxBufferTerminate(CxBuffer *buffer);
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
643
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
644 /**
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
645 * Writes a string to a buffer.
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
646 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
647 * This is a convenience function for <code>cxBufferWrite(str, 1, strlen(str), buffer)</code>.
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
648 *
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
649 * @param buffer the buffer
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
650 * @param str the zero-terminated string
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
651 * @return the number of bytes written
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
652 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
653 cx_attr_nonnull cx_attr_cstr_arg(2)
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
654 CX_EXPORT size_t cxBufferPutString(CxBuffer *buffer, const char *str);
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
655
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
656 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
657 * Gets a character from a buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
658 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
659 * The current position of the buffer is increased after a successful read.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
660 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
661 * @param buffer the buffer to read from
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
662 * @return the character or @c EOF, if the end of the buffer is reached
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
663 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
664 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
665 CX_EXPORT int cxBufferGet(CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
666
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
667 #ifdef __cplusplus
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
668 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
669 #endif
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
670
628
1e2be40f0cb5 use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents: 567
diff changeset
671 #endif // UCX_BUFFER_H

mercurial