/* Pop multiple items from Ring buffer */ int RingBuffer_PopMult(RINGBUFF_T *RingBuff, void *data, int num) { uint8_t *ptr = RingBuff->data; int cnt1, cnt2; /* We cannot insert when queue is empty */ if (RingBuffer_IsEmpty(RingBuff)) return 0; /* Calculate the segment lengths */ cnt1 = cnt2 = RingBuffer_GetCount(RingBuff); if (RB_INDT(RingBuff) + cnt1 >= RingBuff->count) cnt1 = RingBuff->count - RB_INDT(RingBuff); cnt2 -= cnt1; cnt1 = MIN(cnt1, num); num -= cnt1; cnt2 = MIN(cnt2, num); num -= cnt2; /* Write segment 1 */ ptr += RB_INDT(RingBuff) * RingBuff->itemSz; memcpy(data, ptr, cnt1 * RingBuff->itemSz); RingBuff->tail += cnt1; /* Write segment 2 */ ptr = (uint8_t *) RingBuff->data + RB_INDT(RingBuff) * RingBuff->itemSz; data = (uint8_t *) data + cnt1 * RingBuff->itemSz; memcpy(data, ptr, cnt2 * RingBuff->itemSz); RingBuff->tail += cnt2; return cnt1 + cnt2; }
int RingBuffer_Pop(RINGBUFF_T *RingBuff, void *data) { uint8_t *ptr = RingBuff->data; /* We cannot pop when queue is empty */ if (RingBuffer_IsEmpty(RingBuff)) return 0; ptr += RB_INDT(RingBuff) * RingBuff->itemSz; memcpy(data, ptr, RingBuff->itemSz); RingBuff->tail++; return 1; }