mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-27 23:33:53 +03:00
112 lines
3.0 KiB
C
112 lines
3.0 KiB
C
|
/*
|
||
|
* 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 <stdlib.h>
|
||
|
#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_ */
|