feat(kfifo): Add kfifo overwrite write function.
This commit is contained in:
@@ -93,6 +93,17 @@ mr_uint32_t mr_kfifo_pop(mr_kfifo_t *kfifo, void *data);
|
||||
*/
|
||||
mr_uint32_t mr_kfifo_in(mr_kfifo_t *kfifo, const void *buf, mr_uint32_t num);
|
||||
|
||||
/**
|
||||
* @brief This function puts data to a kfifo with overwrite.
|
||||
*
|
||||
* @param kfifo The kfifo.
|
||||
* @param buf The buffer.
|
||||
* @param num The buffer number.
|
||||
* @return The actual pushed element number.
|
||||
*/
|
||||
mr_uint32_t mr_kfifo_in_overwrite(mr_kfifo_t *kfifo, const void *buf,
|
||||
mr_uint32_t num);
|
||||
|
||||
/**
|
||||
* @brief This function peeks data from a kfifo.
|
||||
*
|
||||
|
||||
@@ -115,7 +115,7 @@ mr_uint32_t mr_kfifo_pop(mr_kfifo_t *kfifo, void *data) {
|
||||
mr_uint32_t mr_kfifo_in(mr_kfifo_t *kfifo, const void *buf, mr_uint32_t num) {
|
||||
mr_uint32_t avail, num2, in, size, n;
|
||||
|
||||
/* Limit length */
|
||||
/* Limit number */
|
||||
avail = mr_kfifo_avail(kfifo);
|
||||
if (num > avail) {
|
||||
num = avail;
|
||||
@@ -142,10 +142,31 @@ mr_uint32_t mr_kfifo_in(mr_kfifo_t *kfifo, const void *buf, mr_uint32_t num) {
|
||||
return num2;
|
||||
}
|
||||
|
||||
mr_uint32_t mr_kfifo_in_overwrite(mr_kfifo_t *kfifo, const void *buf,
|
||||
mr_uint32_t num) {
|
||||
mr_uint32_t capacity, avail;
|
||||
|
||||
/* Limit number */
|
||||
capacity = kfifo->mask + 1;
|
||||
if (num > capacity) {
|
||||
buf = ((mr_uint8_t *)buf) + ((num - capacity) * kfifo->elem_size);
|
||||
num = capacity;
|
||||
}
|
||||
|
||||
/* Limit size */
|
||||
avail = mr_kfifo_avail(kfifo);
|
||||
if (num > avail) {
|
||||
mr_kfifo_skip(kfifo, num - avail);
|
||||
}
|
||||
|
||||
/* Push buffer */
|
||||
return mr_kfifo_in(kfifo, buf, num);
|
||||
}
|
||||
|
||||
mr_uint32_t mr_kfifo_peek(mr_kfifo_t *kfifo, void *buf, mr_uint32_t num) {
|
||||
mr_uint32_t avail, num2, out, size, n;
|
||||
|
||||
/* Limit size */
|
||||
/* Limit number */
|
||||
avail = mr_kfifo_len(kfifo);
|
||||
if (num > avail) {
|
||||
num = avail;
|
||||
@@ -164,7 +185,7 @@ mr_uint32_t mr_kfifo_peek(mr_kfifo_t *kfifo, void *buf, mr_uint32_t num) {
|
||||
num *= kfifo->elem_size;
|
||||
}
|
||||
|
||||
/* Pop buffer */
|
||||
/* Peek buffer */
|
||||
n = MR_MIN(num, size - out);
|
||||
mr_memcpy(buf, (mr_uint8_t *)kfifo->buf + out, n);
|
||||
mr_memcpy((mr_uint8_t *)buf + n, kfifo->buf, num - n);
|
||||
|
||||
Reference in New Issue
Block a user