/* Insert multiple items into Ring Buffer */ int RingBuffer_InsertMult(RINGBUFF_T *RingBuff, const void *data, int num) { uint8_t *ptr = RingBuff->data; int cnt1, cnt2; /* We cannot insert when queue is full */ if (RingBuffer_IsFull(RingBuff)) return 0; /* Calculate the segment lengths */ cnt1 = cnt2 = RingBuffer_GetFree(RingBuff); if (RB_INDH(RingBuff) + cnt1 >= RingBuff->count) cnt1 = RingBuff->count - RB_INDH(RingBuff); cnt2 -= cnt1; cnt1 = MIN(cnt1, num); num -= cnt1; cnt2 = MIN(cnt2, num); num -= cnt2; /* Write segment 1 */ ptr += RB_INDH(RingBuff) * RingBuff->itemSz; memcpy(ptr, data, cnt1 * RingBuff->itemSz); RingBuff->head += cnt1; /* Write segment 2 */ ptr = (uint8_t *) RingBuff->data + RB_INDH(RingBuff) * RingBuff->itemSz; data = (const uint8_t *) data + cnt1 * RingBuff->itemSz; memcpy(ptr, data, cnt2 * RingBuff->itemSz); RingBuff->head += cnt2; return cnt1 + cnt2; }
/* Insert a single item into Ring Buffer */ int RingBuffer_Insert(RINGBUFF_T *RingBuff, const void *data) { uint8_t *ptr = RingBuff->data; /* We cannot insert when queue is full */ if (RingBuffer_IsFull(RingBuff)) return 0; ptr += RB_INDH(RingBuff) * RingBuff->itemSz; memcpy(ptr, data, RingBuff->itemSz); RingBuff->head++; return 1; }