diff options
Diffstat (limited to 'debian/pilot-link/pilot-link-0.12.5-dfsg/include/pi-buffer.h')
-rw-r--r-- | debian/pilot-link/pilot-link-0.12.5-dfsg/include/pi-buffer.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/debian/pilot-link/pilot-link-0.12.5-dfsg/include/pi-buffer.h b/debian/pilot-link/pilot-link-0.12.5-dfsg/include/pi-buffer.h new file mode 100644 index 00000000..67f2a855 --- /dev/null +++ b/debian/pilot-link/pilot-link-0.12.5-dfsg/include/pi-buffer.h @@ -0,0 +1,143 @@ +/* + * $Id: pi-buffer.h,v 1.6 2006/10/17 13:24:06 desrod Exp $ + * + * pi-buffer.h: simple data block management for variable data storage + * + * Copyright (c) 2004-2005, Florent Pillet. + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Library General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library + * General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; if not, write to the Free Software Foundation, + * * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/** @file pi-buffer.h + * @brief Variable size buffer management interface + * @author Florent Pillet + * + * pi-buffer provides for a reliable and easy to use variable size buffer + * management, allowing for buffers that grow as needed to store + * variable-length data. + * + * When you create a buffer with pi_buffer_new(), you indicate an initial + * capacity that is allocated. The number of used bytes is set to 0. To + * append data to the buffer, use pi_buffer_append(). This ensures that the + * buffer grows as needed. + * + * You can access data in the buffer using the @a buffer->data member. The + * number of bytes used is always accessible using @a buffer->used. + * + * It is possible to use the pi-buffer functions on static buffers. In this + * case, you won't call pi_buffer_free() on the structure. You'll dispose of + * the memory yourself instead. Here is an example: + * + * @code + * pi_buffer_t mybuf; + * mybuf.data = (unsigned char *) malloc(256); + * mybuf.allocated = 256; + * mybuf.used = 0; + * + * // ... perform your tasks here .... + * pi_buffer_append(&mybuf, somedata, somedatasize); + * // ... + * + * free(mybuf.data); + * @endcode + */ + +#ifndef _PILOT_BUFFER_H_ +#define _PILOT_BUFFER_H_ + +#include "pi-args.h" + +#ifdef __cplusplus +extern "C" { +#endif + /** @brief Variable buffer structure */ + typedef struct pi_buffer_t { + unsigned char *data; /**< Pointer to the data */ + size_t allocated; /**< Number of bytes allocated */ + size_t used; /**< Number of allocated bytes actually used */ + } pi_buffer_t; + + /** @brief Create a new variable size buffer + * + * Dispose of this buffer with pi_buffer_free() + * + * @param capacity Initial size to allocate + * @return A newly allocated pi_buffer_t structure + */ + extern pi_buffer_t* pi_buffer_new + PI_ARGS((size_t capacity)); + + /** @brief Ensure the buffer is large enough to store @p capacity bytes of data + * + * This grows the allocated buffer as needed and updates the @a allocated + * member. Doesn't touch the @a used member. After this call succeeds, you + * can directly use the @a buffer->data pointer to store up to + * @a buffer->allocated bytes using direct memory access. + * + * @param buf The buffer to grow + * @param new_capacity The total number of bytes the buffer is expected to contain + * @return The @p buf buffer on success, NULL if a memory error happened + */ + extern pi_buffer_t* pi_buffer_expect + PI_ARGS((pi_buffer_t *buf, size_t new_capacity)); + + /** @brief Append data to the buffer + * + * Grow the buffer if needed. + * + * @param buf The buffer to grow + * @param data Pointer to the data to append + * @param len Length of the data to append + * @return The @p buf buffer on success, NULL if a memory error happened + */ + extern pi_buffer_t* pi_buffer_append + PI_ARGS((pi_buffer_t *buf, PI_CONST void *data, size_t len)); + + /** @brief Append a buffer to another buffer + * + * @param dest The buffer to append to + * @param src Buffer whose data will be appended to @p dest + * @return The @p dest buffer on success, NULL if a memory error happened + */ + extern pi_buffer_t* pi_buffer_append_buffer + PI_ARGS((pi_buffer_t *dest, PI_CONST pi_buffer_t *src)); + + /** @brief Reset the @a used member of a buffer + * + * The @p used member is set to 0. If the actual allocated bytes is large, + * the allocation may shrink to a reasonable value to prevent unneeded + * memory use. + * + * @param buf The buffer to clear + * @return The @p buf parameter + */ + extern void pi_buffer_clear + PI_ARGS((pi_buffer_t *buf)); + + /** @brief Dispose of all memory used by a buffer allocated with pi_buffer_new() + * + * After this call, the @p buf structure itself will have been freed as well. + * Do not reuse the pointer. + * + * @param buf The buffer to dispose of + */ + extern void pi_buffer_free + PI_ARGS((pi_buffer_t *buf)); + +#ifdef __cplusplus +} +#endif + +#endif |