src/cx/buffer.h

Fri, 23 May 2025 12:44:24 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 23 May 2025 12:44:24 +0200
changeset 1327
ed75dc1db503
parent 1318
12fa1d37fe48
permissions
-rw-r--r--

make test-compile depend on both static and shared

the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build

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.
1024
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
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
65 * set when the copy-on-write operations 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 /**
1024
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
1024
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 *
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
77 * The current contents of the buffer will be copied to the new memory and the flag
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: 1024
diff changeset
82 /**
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1024
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: 1024
diff changeset
84 *
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1024
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: 1024
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: 1024
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: 1024
diff changeset
88 */
3e4905241838 add copy-on-extend feature to UCX buffer - fixes #533
Mike Becker <universe@uap-core.de>
parents: 1024
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: 1024
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 /**
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
130 * The target for write function.
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
1024
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
1024
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 *
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
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: 1024
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: 1024
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: 1024
diff changeset
212 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
213 * @note You may provide @c NULL as 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
1024
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)
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
230 cx_attr_export
501
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
231 int cxBufferInit(
9a08f5e515cc add allocator support to CxBuffer
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
232 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
233 void *space,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
234 size_t capacity,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 761
diff changeset
235 const CxAllocator *allocator,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
236 int flags
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
237 );
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
238
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
239 /**
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
240 * Configures the buffer for flushing.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
241 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
242 * Flushing can happen automatically when data is written
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
243 * to the buffer (see cxBufferWrite()) or manually when
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
244 * cxBufferFlush() is called.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
245 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
246 * @param buffer the buffer
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
247 * @param config the flush configuration
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
248 * @retval zero success
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
249 * @retval non-zero failure
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
250 * @see cxBufferFlush()
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
251 * @see cxBufferWrite()
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
252 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
253 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
254 cx_attr_export
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
255 int cxBufferEnableFlushing(
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
256 CxBuffer *buffer,
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
257 CxBufferFlushConfig config
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
258 );
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
259
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
260 /**
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
261 * Destroys the buffer contents.
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 * 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
264 * 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
265 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
266 * @param buffer the buffer which contents shall be destroyed
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
267 * @see cxBufferInit()
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
268 */
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
269 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
270 cx_attr_export
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
271 void cxBufferDestroy(CxBuffer *buffer);
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 /**
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
274 * Deallocates the buffer.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
275 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
276 * 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
277 * 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
278 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
279 * @remark As with all free() functions, this accepts @c NULL arguments in which
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
280 * case it does nothing.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
281 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
282 * @param buffer the buffer to deallocate
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
283 * @see cxBufferCreate()
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
284 */
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
285 cx_attr_export
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
286 void cxBufferFree(CxBuffer *buffer);
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
287
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
288 /**
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
289 * 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
290 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
291 * You may also provide a read-only @p space, in which case
1024
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
292 * 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
293 * #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
294 * 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
295 * 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: 1024
diff changeset
296 * #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: 1024
diff changeset
297 * #CX_BUFFER_AUTO_EXTEND flag.
1024
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
298 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
299 * @note You may provide @c NULL as 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
300 * 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
301 * 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
302 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
303 * @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
304 * new memory
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
305 * @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
306 * @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
307 * memory management within the buffer
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1291
diff changeset
308 * (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
309 * @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
310 * @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
311 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
312 cx_attr_malloc
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
313 cx_attr_dealloc(cxBufferFree, 1)
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
314 cx_attr_nodiscard
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
315 cx_attr_export
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
316 CxBuffer *cxBufferCreate(
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
317 void *space,
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
318 size_t capacity,
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 761
diff changeset
319 const CxAllocator *allocator,
683
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
320 int flags
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
321 );
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
322
aa0d09f2d81c add convenience functions for allocating a buffer on the heap
Mike Becker <universe@uap-core.de>
parents: 673
diff changeset
323 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
324 * 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
325 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
326 * 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
327 * 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
328 * 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
329 * no contents are changed.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
330 * If auto extension is disabled, the contents that do not fit into the buffer
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
331 * are discarded.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
332 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
333 * 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
334 * first @p shift bytes are discarded.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
335 * 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
336 * 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
337 * not cleared, see the security note below).
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
338 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
339 * The buffer position gets shifted alongside with the content but is kept
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
340 * within the boundaries of the buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
341 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
342 * @note For situations where @c off_t is not large enough, there are specialized cxBufferShiftLeft() and
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
343 * cxBufferShiftRight() functions using a @c size_t as parameter type.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
344 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
345 * @attention
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
346 * Security Note: The shifting operation does @em not erase the previously occupied memory cells.
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
347 * But you can easily do that manually, e.g. by calling
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
348 * <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
349 * <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
350 * for a left shift.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
351 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
352 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
353 * @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
354 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
355 * @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
356 * @see cxBufferShiftLeft()
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
357 * @see cxBufferShiftRight()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
358 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
359 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
360 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
361 int cxBufferShift(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
362 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
363 off_t shift
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
364 );
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 * Shifts the buffer to the right.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
368 * See cxBufferShift() for details.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
369 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
370 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
371 * @param shift the shift offset
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
372 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
373 * @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
374 * @see cxBufferShift()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
375 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
376 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
377 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
378 int cxBufferShiftRight(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
379 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
380 size_t shift
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
381 );
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
382
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
383 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
384 * Shifts the buffer to the left.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
385 * See cxBufferShift() for details.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
386 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
387 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
388 * @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
389 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
390 * @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
391 * @see cxBufferShift()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
392 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
393 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
394 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
395 int cxBufferShiftLeft(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
396 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
397 size_t shift
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
398 );
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
399
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
400
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
401 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
402 * Moves the position of the buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
403 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
404 * 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
405 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
406 * @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
407 * @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
408 * @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
409 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
410 * 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
411 * (@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
412 * unchanged (@c SEEK_CUR).
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
413 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
414 * @param buffer the buffer
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
415 * @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
416 * @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
417 * @retval zero success
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
418 * @retval non-zero if the position is invalid
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
419 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
420 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
421 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
422 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
423 int cxBufferSeek(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
424 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
425 off_t offset,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
426 int whence
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 * 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
431 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
432 * 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
433 * 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
434 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
435 * @note If the #CX_BUFFER_COPY_ON_WRITE flag is set, this function
1024
8f99f6c28bd3 add copy-on-write feature to UCX buffer - fixes #531
Mike Becker <universe@uap-core.de>
parents: 1016
diff changeset
436 * 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
437 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
438 * @param buffer the buffer to be cleared
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
439 * @see cxBufferReset()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
440 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
441 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
442 cx_attr_export
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
443 void cxBufferClear(CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
444
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
445 /**
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
446 * 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
447 *
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
448 * 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
449 * reset of the buffer, use cxBufferClear().
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
450 *
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
451 * @param buffer the buffer to be cleared
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
452 * @see cxBufferClear()
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
453 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
454 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
455 cx_attr_export
761
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
456 void cxBufferReset(CxBuffer *buffer);
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
457
61d5197d612b add cxBufferReset() - resolves #338
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
458 /**
757
49ceea78fce7 fix incorrect documentation of cxBufferEof()
Mike Becker <universe@uap-core.de>
parents: 683
diff changeset
459 * 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
460 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
461 * @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
462 * @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
463 * byte of the buffer's contents
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
464 * @retval false otherwise
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
465 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
466 cx_attr_nonnull
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
467 cx_attr_nodiscard
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
468 cx_attr_export
1004
d8044fd5005c make cxBufferEof() return a bool
Mike Becker <universe@uap-core.de>
parents: 989
diff changeset
469 bool cxBufferEof(const CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
470
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
471
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
472 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
473 * Ensures that the buffer has a minimum capacity.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
474 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
475 * 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
476 *
1291
5942859fd76c new auto-extend strategy for CxBuffer - resolves #641
Mike Becker <universe@uap-core.de>
parents: 1290
diff changeset
477 * 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
478 * 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
479 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
480 * @param buffer the buffer
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
481 * @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
482 * @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
483 * @retval non-zero on allocation failure
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
484 * @see cxBufferShrink()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
485 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
486 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
487 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
488 int cxBufferMinimumCapacity(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
489 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
490 size_t capacity
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
491 );
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
492
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
493 /**
1290
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
494 * 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
495 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
496 * 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
497 * the number of reserved bytes.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
498 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
499 * 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
500 * nothing happens.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
501 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
502 * 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
503 * this function does nothing.
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
504 *
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
505 * @param buffer the buffer
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
506 * @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
507 * @see cxBufferMinimumCapacity()
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
508 */
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
509 cx_attr_nonnull
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
510 cx_attr_export
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
511 void cxBufferShrink(
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
512 CxBuffer *buffer,
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
513 size_t reserve
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
514 );
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
515
4ac889e14211 adds cxBufferShrink() - resolves #626
Mike Becker <universe@uap-core.de>
parents: 1284
diff changeset
516 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
517 * Writes data to a CxBuffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
518 *
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
519 * If automatic flushing is not enabled, the data is simply written into the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
520 * buffer at the current position and the position of the buffer is increased
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
521 * by the number of bytes written.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
522 *
567
f90a7cfe2480 #184 #170 more thorough flush testing
Mike Becker <universe@uap-core.de>
parents: 545
diff changeset
523 * 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
524 * 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
525 * 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
526 * 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
527 * 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
528 *
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
529 * 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
530 * 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
531 *
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
532 * 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
533 * 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
534 * 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
535 *
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
536 * The number returned by this function is the number of elements from
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
537 * @c ptr that could be written to either the flush target or the buffer
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
538 * (so it does not include the number of items that had been already in the buffer
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
539 * in were flushed during the process).
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
540 *
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
541 * @attention
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
542 * 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
543 * with @p size, flushing stops after all complete items have been flushed, leaving
cc60b7d07912 fix #566 by changing the spec (pro-move 8)
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
544 * the mis-aligned 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
545 * 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
546 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
547 * @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
548 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
549 * @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
550 * @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
551 * @param nitems the element count
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
552 * @param buffer the CxBuffer to write to
537
16219eba3a0a fix doc error for cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 531
diff changeset
553 * @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
554 * @see cxBufferAppend()
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
555 * @see cxBufferRead()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
556 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
557 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
558 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
559 size_t cxBufferWrite(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 761
diff changeset
560 const void *ptr,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
561 size_t size,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
562 size_t nitems,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
563 CxBuffer *buffer
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
564 );
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
565
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
566 /**
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
567 * Appends data to a CxBuffer.
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
568 *
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
569 * 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
570 * regardless of the current position.
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
571 * 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
572 * while additional data is added to the buffer occasionally.
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
573 * 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
574 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
575 * @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
576 *
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
577 * @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
578 * @param size the length of one element
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
579 * @param nitems the element count
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
580 * @param buffer the CxBuffer to write to
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
581 * @return the total count of elements written
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
582 * @see cxBufferWrite()
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
583 * @see cxBufferRead()
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
584 */
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
585 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
586 cx_attr_export
1030
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
587 size_t cxBufferAppend(
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
588 const void *ptr,
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
589 size_t size,
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
590 size_t nitems,
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
591 CxBuffer *buffer
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
592 );
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
593
06091e067bee add cxBufferAppend() - fixes #534
Mike Becker <universe@uap-core.de>
parents: 1029
diff changeset
594 /**
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
595 * Performs a single flush-run on the specified buffer.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
596 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
597 * Does nothing when the position in the buffer is zero.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
598 * Otherwise, the data until the current position minus
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
599 * one is considered for flushing.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
600 * Note carefully that flushing will never exceed the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
601 * current @em position, even when the size of the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
602 * buffer is larger than the current position.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
603 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
604 * One flush run will try to flush @c blkmax many
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
605 * blocks of size @c blksize until either the @p buffer
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
606 * has no more data to flush or the write function
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
607 * used for flushing returns zero.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
608 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
609 * The buffer is shifted left for that many bytes
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
610 * the flush operation has successfully flushed.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
611 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
612 * @par Example 1
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
613 * 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
614 * at position 200. The flush configuration is
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
615 * @c blkmax=4 and @c blksize=64 .
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
616 * Assume that the entire flush operation is successful.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
617 * All 200 bytes on the left hand-side from the current
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
618 * position are written.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
619 * That means, the size of the buffer is now 140 and the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
620 * position is zero.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
621 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
622 * @par Example 2
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
623 * Same as Example 1, but now the @c blkmax is 1.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
624 * The size of the buffer is now 276 and the position is 136.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
625 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
626 * @par Example 3
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
627 * Same as Example 1, but now assume the flush target
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
628 * only accepts 100 bytes before returning zero.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
629 * That means, the flush operations manages to flush
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
630 * one complete block and one partial block, ending
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
631 * up with a buffer with size 240 and position 100.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
632 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
633 * @remark Just returns zero when flushing was not enabled with
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
634 * cxBufferEnableFlushing().
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
635 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
636 * @remark When the buffer uses copy-on-write, the memory
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
637 * is copied first, before attempting any flush.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
638 * This is, however, considered an erroneous use of the
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
639 * buffer, because it does not make much sense to put
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
640 * readonly data into an UCX buffer for flushing, instead
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
641 * of writing it directly to the target.
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
642 *
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
643 * @param buffer the buffer
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
644 * @return the number of successfully flushed bytes
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
645 * @see cxBufferEnableFlushing()
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
646 */
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
647 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
648 cx_attr_export
1110
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
649 size_t cxBufferFlush(CxBuffer *buffer);
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
650
a0e9be7ed131 re-implement flushing
Mike Becker <universe@uap-core.de>
parents: 1090
diff changeset
651 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
652 * Reads data from a CxBuffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
653 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
654 * 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
655 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
656 * @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
657 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
658 * @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
659 * @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
660 * @param nitems the element count
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
661 * @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
662 * @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
663 * @see cxBufferWrite()
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
664 * @see cxBufferAppend()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
665 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
666 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
667 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
668 size_t cxBufferRead(
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
669 void *ptr,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
670 size_t size,
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
671 size_t nitems,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
672 CxBuffer *buffer
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
673 );
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
674
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
675 /**
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
676 * Writes a character to a buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
677 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
678 * 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
679 * 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
680 * the buffer capacity is extended by cxBufferMinimumCapacity(). If the feature
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
681 * is disabled or buffer extension fails, @c EOF is returned.
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
682 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
683 * On successful write, the position of the buffer is increased.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
684 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
685 * 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
686 * should use cxBufferTerminate() instead.
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
687 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
688 * @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
689 * @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
690 * @return the byte that has been written or @c EOF when the end of the stream is
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
691 * 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
692 * @see cxBufferTerminate()
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
693 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
694 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
695 cx_attr_export
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
696 int cxBufferPut(
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
697 CxBuffer *buffer,
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
698 int c
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
699 );
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
700
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
701 /**
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
702 * 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
703 *
1284
b2103354baed fix implementation of cxBufferTerminate() - fixes #631
Mike Becker <universe@uap-core.de>
parents: 1181
diff changeset
704 * 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
705 *
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
706 * 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
707 * 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
708 *
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
709 * @param buffer the buffer to write to
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
710 * @return zero, if the terminator could be written, non-zero otherwise
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
711 */
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
712 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
713 cx_attr_export
1005
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
714 int cxBufferTerminate(CxBuffer *buffer);
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
715
67fa386ce600 add cxBufferTerminate()
Mike Becker <universe@uap-core.de>
parents: 1004
diff changeset
716 /**
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
717 * Writes a string to a buffer.
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
718 *
1090
4384fe041d6e refine docs for buffer.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1030
diff changeset
719 * 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
720 *
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
721 * @param buffer the buffer
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
722 * @param str the zero-terminated string
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
723 * @return the number of bytes written
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
724 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
725 cx_attr_nonnull
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
726 cx_attr_cstr_arg(2)
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
727 cx_attr_export
529
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
728 size_t cxBufferPutString(
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
729 CxBuffer *buffer,
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
730 const char *str
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
731 );
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
732
814d51173f20 #171 const qualifier and nonnull attributes
Mike Becker <universe@uap-core.de>
parents: 501
diff changeset
733 /**
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
734 * Gets a character from a buffer.
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
735 *
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
736 * 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
737 *
485
6a86ad3d8c03 use same doxygen style in all files
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
738 * @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
739 * @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
740 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 948
diff changeset
741 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1135
diff changeset
742 cx_attr_export
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 489
diff changeset
743 int cxBufferGet(CxBuffer *buffer);
483
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
744
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
745 #ifdef __cplusplus
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
746 }
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
747 #endif
929016224c3c add ported UCX buffer implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
748
628
1e2be40f0cb5 use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents: 567
diff changeset
749 #endif // UCX_BUFFER_H

mercurial