135 * @return a new buffer with the extracted content |
135 * @return a new buffer with the extracted content |
136 */ |
136 */ |
137 #define ucx_buffer_clone(src,flags) \ |
137 #define ucx_buffer_clone(src,flags) \ |
138 ucx_buffer_extract(src, 0, (src)->capacity, flags) |
138 ucx_buffer_extract(src, 0, (src)->capacity, flags) |
139 |
139 |
|
140 |
|
141 /** |
|
142 * Shifts the contents of the buffer by the given offset. |
|
143 * |
|
144 * If the offset is positive, the contents are shifted to the right. |
|
145 * If auto extension is enabled, the buffer grows, if necessary. |
|
146 * In case the auto extension fails, this function returns a non-zero value and |
|
147 * no contents are changed. |
|
148 * If auto extension is disabled, the contents that do not fit into the buffer |
|
149 * are discarded. |
|
150 * |
|
151 * If the offset is negative, the contents are shifted to the left where the |
|
152 * first <code>shift</code> bytes are discarded. |
|
153 * The new size of the buffer is the old size minus |
|
154 * the absolute shift value. |
|
155 * If this value is larger than the buffer size, the buffer is emptied (but |
|
156 * not cleared, see the security note below). |
|
157 * |
|
158 * The buffer position gets shifted alongside with the content but is kept |
|
159 * within the boundaries of the buffer. |
|
160 * |
|
161 * <b>Security note:</b> the shifting operation does <em>not</em> erase the |
|
162 * previously occupied memory cells. You can easily do that manually, e.g. by |
|
163 * calling <code>memset(buffer->space, 0, shift)</code> for a right shift or |
|
164 * <code>memset(buffer->size, 0, buffer->capacity-buffer->size)</code> |
|
165 * for a left shift. |
|
166 * |
|
167 * @param buffer the buffer |
|
168 * @param shift the shift offset (negative means left shift) |
|
169 * @return 0 on success, non-zero if a required auto-extension fails |
|
170 */ |
|
171 int ucx_buffer_shift(UcxBuffer* buffer, off_t shift); |
|
172 |
|
173 /** |
|
174 * Shifts the buffer to the right. |
|
175 * See ucx_buffer_shift() for details. |
|
176 * |
|
177 * @param buffer the buffer |
|
178 * @param shift the shift offset |
|
179 * @return 0 on success, non-zero if a required auto-extension fails |
|
180 * @see ucx_buffer_shift() |
|
181 */ |
|
182 int ucx_buffer_shift_right(UcxBuffer* buffer, size_t shift); |
|
183 |
|
184 /** |
|
185 * Shifts the buffer to the left. |
|
186 * |
|
187 * See ucx_buffer_shift() for details. Note, however, that this method expects |
|
188 * a positive shift offset. |
|
189 * |
|
190 * Since a left shift cannot fail due to memory allocation problems, this |
|
191 * function always returns zero. |
|
192 * |
|
193 * @param buffer the buffer |
|
194 * @param shift the shift offset |
|
195 * @return always zero |
|
196 * @see ucx_buffer_shift() |
|
197 */ |
|
198 int ucx_buffer_shift_left(UcxBuffer* buffer, size_t shift); |
|
199 |
|
200 |
140 /** |
201 /** |
141 * Moves the position of the buffer. |
202 * Moves the position of the buffer. |
142 * |
203 * |
143 * The new position is relative to the <code>whence</code> argument. |
204 * The new position is relative to the <code>whence</code> argument. |
144 * |
205 * |
258 * |
319 * |
259 * @param buffer the buffer |
320 * @param buffer the buffer |
260 * @param str the string |
321 * @param str the string |
261 * @return the number of bytes written |
322 * @return the number of bytes written |
262 */ |
323 */ |
263 size_t ucx_buffer_puts(UcxBuffer *buffer, char *str); |
324 size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str); |
264 |
325 |
265 /** |
326 /** |
266 * Returns the complete buffer content as sstr_t. |
327 * Returns the complete buffer content as sstr_t. |
267 * @param buffer the buffer |
328 * @param buffer the buffer |
268 * @return the result of <code>sstrn()</code> with the buffer space and size |
329 * @return the result of <code>sstrn()</code> with the buffer space and size |