/* * Copyright (c) 2014-2018 Cesanta Software Limited * All rights reserved * * Licensed under the Apache License, Version 2.0 (the ""License""); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an ""AS IS"" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Mbufs are mutable/growing memory buffers, like C++ strings. * Mbuf can append data to the end of a buffer or insert data into arbitrary * position in the middle of a buffer. The buffer grows automatically when * needed. */ #ifndef CS_COMMON_MBUF_H_ #define CS_COMMON_MBUF_H_ #include #include "platform.h" #if defined(__cplusplus) extern "C" { #endif #ifndef MBUF_SIZE_MULTIPLIER #define MBUF_SIZE_MULTIPLIER 1.5 #endif #ifndef MBUF_SIZE_MAX_HEADROOM #ifdef BUFSIZ #define MBUF_SIZE_MAX_HEADROOM BUFSIZ #else #define MBUF_SIZE_MAX_HEADROOM 1024 #endif #endif /* Memory buffer descriptor */ struct mbuf { char *buf; /* Buffer pointer */ size_t len; /* Data length. Data is located between offset 0 and len. */ size_t size; /* Buffer size allocated by realloc(1). Must be >= len */ }; /* * Initialises an Mbuf. * `initial_capacity` specifies the initial capacity of the mbuf. */ void mbuf_init(struct mbuf *, size_t initial_capacity); /* Frees the space allocated for the mbuffer and resets the mbuf structure. */ void mbuf_free(struct mbuf *); /* * Appends data to the Mbuf. * * Returns the number of bytes appended or 0 if out of memory. */ size_t mbuf_append(struct mbuf *, const void *data, size_t data_size); /* * Appends data to the Mbuf and frees it (data must be heap-allocated). * * Returns the number of bytes appended or 0 if out of memory. * data is freed irrespective of return value. */ size_t mbuf_append_and_free(struct mbuf *, void *data, size_t data_size); /* * Inserts data at a specified offset in the Mbuf. * * Existing data will be shifted forwards and the buffer will * be grown if necessary. * Returns the number of bytes inserted. */ size_t mbuf_insert(struct mbuf *, size_t, const void *, size_t); /* Removes `data_size` bytes from the beginning of the buffer. */ void mbuf_remove(struct mbuf *, size_t data_size); /* * Resizes an Mbuf. * * If `new_size` is smaller than buffer's `len`, the * resize is not performed. */ void mbuf_resize(struct mbuf *, size_t new_size); /* Moves the state from one mbuf to the other. */ void mbuf_move(struct mbuf *from, struct mbuf *to); /* Removes all the data from mbuf (if any). */ void mbuf_clear(struct mbuf *); /* Shrinks an Mbuf by resizing its `size` to `len`. */ void mbuf_trim(struct mbuf *); #if defined(__cplusplus) } #endif /* __cplusplus */ #endif /* CS_COMMON_MBUF_H_ */