1/* 2 * QEMU generic buffers 3 * 4 * Copyright (c) 2015 Red Hat, Inc. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18 * 19 */ 20 21#ifndef QEMU_BUFFER_H 22#define QEMU_BUFFER_H 23 24#include "qemu-common.h" 25 26typedef struct Buffer Buffer; 27 28/** 29 * Buffer: 30 * 31 * The Buffer object provides a simple dynamically resizing 32 * array, with separate tracking of capacity and usage. This 33 * is typically useful when buffering I/O or processing data. 34 */ 35 36struct Buffer { 37 char *name; 38 size_t capacity; 39 size_t offset; 40 uint64_t avg_size; 41 uint8_t *buffer; 42}; 43 44/** 45 * buffer_init: 46 * @buffer: the buffer object 47 * @name: buffer name 48 * 49 * Optionally attach a name to the buffer, to make it easier 50 * to identify in debug traces. 51 */ 52void buffer_init(Buffer *buffer, const char *name, ...) 53 GCC_FMT_ATTR(2, 3); 54 55/** 56 * buffer_shrink: 57 * @buffer: the buffer object 58 * 59 * Try to shrink the buffer. Checks current buffer capacity and size 60 * and reduces capacity in case only a fraction of the buffer is 61 * actually used. 62 */ 63void buffer_shrink(Buffer *buffer); 64 65/** 66 * buffer_reserve: 67 * @buffer: the buffer object 68 * @len: the minimum required free space 69 * 70 * Ensure that the buffer has space allocated for at least 71 * @len bytes. If the current buffer is too small, it will 72 * be reallocated, possibly to a larger size than requested. 73 */ 74void buffer_reserve(Buffer *buffer, size_t len); 75 76/** 77 * buffer_reset: 78 * @buffer: the buffer object 79 * 80 * Reset the length of the stored data to zero, but do 81 * not free / reallocate the memory buffer 82 */ 83void buffer_reset(Buffer *buffer); 84 85/** 86 * buffer_free: 87 * @buffer: the buffer object 88 * 89 * Reset the length of the stored data to zero and also 90 * free the internal memory buffer 91 */ 92void buffer_free(Buffer *buffer); 93 94/** 95 * buffer_append: 96 * @buffer: the buffer object 97 * @data: the data block to append 98 * @len: the length of @data in bytes 99 * 100 * Append the contents of @data to the end of the buffer. 101 * The caller must ensure that the buffer has sufficient 102 * free space for @len bytes, typically by calling the 103 * buffer_reserve() method prior to appending. 104 */ 105void buffer_append(Buffer *buffer, const void *data, size_t len); 106 107/** 108 * buffer_advance: 109 * @buffer: the buffer object 110 * @len: the number of bytes to skip 111 * 112 * Remove @len bytes of data from the head of the buffer. 113 * The internal buffer will not be reallocated, so will 114 * have at least @len bytes of free space after this 115 * call completes 116 */ 117void buffer_advance(Buffer *buffer, size_t len); 118 119/** 120 * buffer_end: 121 * @buffer: the buffer object 122 * 123 * Get a pointer to the tail end of the internal buffer 124 * The returned pointer is only valid until the next 125 * call to buffer_reserve(). 126 * 127 * Returns: the tail of the buffer 128 */ 129uint8_t *buffer_end(Buffer *buffer); 130 131/** 132 * buffer_empty: 133 * @buffer: the buffer object 134 * 135 * Determine if the buffer contains any current data 136 * 137 * Returns: true if the buffer holds data, false otherwise 138 */ 139gboolean buffer_empty(Buffer *buffer); 140 141/** 142 * buffer_move_empty: 143 * @to: destination buffer object 144 * @from: source buffer object 145 * 146 * Moves buffer, without copying data. 'to' buffer must be empty. 147 * 'from' buffer is empty and zero-sized on return. 148 */ 149void buffer_move_empty(Buffer *to, Buffer *from); 150 151/** 152 * buffer_move: 153 * @to: destination buffer object 154 * @from: source buffer object 155 * 156 * Moves buffer, copying data (unless 'to' buffer happens to be empty). 157 * 'from' buffer is empty and zero-sized on return. 158 */ 159void buffer_move(Buffer *to, Buffer *from); 160 161#endif /* QEMU_BUFFER_H */ 162