123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- #include <stdio.h>
- #include "string.h"
- #include "stdlib.h"
- #include "lib_ringbuf.h"
- #define VALID_LEN (Object->push_size - Object->pop_size) //缓冲区有效长度
- int RingBuf_discard(RingBuf Object, int size) ;
- RingBuf RingBuf_Init(RingBufOBJ *data, void *buffer, int buff_size)
- {
- RingBuf result = NULL;
- if (data != NULL && buffer != NULL && buff_size > 0)
- {
- data->pHead = buffer;
- data->size = buff_size;
- data->pTail = data->pHead + buff_size;
- data->pValid = data->pHead;
- data->pValidTail = data->pHead;
- data->push_size = 0;
- data->pop_size = 0;
- result = data;
- }
- return result;
- }
- void RingBuf_Reset(RingBuf Object)
- {
- if (Object != NULL)
- {
- Object->pValid = Object->pHead;
- Object->pValidTail = Object->pHead;
- Object->push_size = 0;
- Object->pop_size = 0;
- }
- return ;
- }
- void RingBuf_Fini(RingBufOBJ *data)
- {
- if (data != NULL)
- {
- data->pValid = data->pValidTail = data->pHead;
- data->pop_size = data->push_size;
- }
- }
- int RingBuf_Push(RingBuf Object, const void *data, int size)
- {
- int result = 0;
- int _ValidLength = Object->push_size - Object->pop_size;
- int _Size = Object->size - _ValidLength; //实际可用 为0?
-
- if( _Size <= size )
- {
- RingBuf_discard(Object,size);
- }
-
- if(Object->pop_size >= Object->push_size )
- {
- RingBuf_Reset(Object);
- }
-
- if (data == NULL)
- {
- result = -1;
- return result;
- }
-
- if (size > 0 && _Size > 0) //保留原本不能丢弃
- {
- if (_Size < size)
- size = _Size;
- result = size;
- if (Object->pValidTail + size > Object->pTail)//写入之后超出缓冲区 分两段
- {
- int rest = Object->pTail - Object->pValidTail;
- memcpy(Object->pValidTail, data, rest);
- memcpy(Object->pHead, (char *)data + rest, size - rest);
- Object->pValidTail = Object->pHead + size - rest;
- }
- else
- {
- memcpy(Object->pValidTail, data, size);
- Object->pValidTail += size;
- if (Object->pValidTail == Object->pTail)
- Object->pValidTail = Object->pHead;
- }
- Object->push_size += result;
- }
- // printf(" push = %s\n", Object->pHead);
- return result;
- }
- int RingBuf_Peek(RingBuf Object, void *data, int size)//返回实际尺寸
- {
- int result = 0;
- if (data == NULL)
- {
- result = -1;
- return result;
- }
-
-
- if (size > 0 && Object->pop_size != Object->push_size)
- {
- int _ValidLength = Object->push_size - Object->pop_size;
- if (size > _ValidLength)//可能会push VALID_LEN变大 导致size变大越界
- size = _ValidLength;
- if (Object->pValid + size > Object->pTail)//需要分成两段copy
- {
- int rest = Object->pTail - Object->pValid;
- memcpy(data, Object->pValid, rest);
- memcpy((char*)data + rest, Object->pHead, size - rest);//第二段,绕到整个存储区的开头
- }
- else
- {
- memcpy(data, Object->pValid, size);
- }
- result = size;
- }
- return result;
- }
- int RingBuf_Pop(RingBuf Object, void *data, int size)
- {
- int result = 0;
- if (data == NULL)
- result = -1;
- else if (size > 0 && Object->pop_size != Object->push_size)
- {
- int _ValidLength = Object->push_size - Object->pop_size;
- if (size > _ValidLength)//可能会push VALID_LEN变大 导致size变大越界
- size = _ValidLength;
-
- if((Object->pValidTail - size) >= Object->pHead)
- {
- //数据在缓冲区中间,一次性读取;
- Object->pValidTail = Object->pValidTail - size;
- memcpy(data, Object->pValidTail, size);
- memset(Object->pValidTail, 0x00, size);
- }
- else
- {
- //数据在缓冲区首尾,需要分两段读取
- Object->pValidTail = Object->pValidTail + Object->size - size;
-
- int RestLength = Object->pTail - Object->pValidTail;
- memcpy(data, Object->pValidTail, RestLength);
- memset(Object->pValidTail, 0x00, RestLength);
-
- memcpy((char*)data+RestLength, Object->pHead, size - RestLength);
- memset(Object->pHead, 0x00, size - RestLength);
- }
- result = size;
- Object->pop_size += result;
- }
- // printf("pop = %s\n",(char*)data);
- return result;
- }
- int RingBuf_Pop_head(RingBuf Object, void *data, int size)
- {
- int result = 0;
- if (data == NULL)
- result = -1;
- else if (size > 0 && Object->pop_size != Object->push_size)
- {
- int _ValidLength = Object->push_size - Object->pop_size;
- if (size > _ValidLength)//可能会push VALID_LEN变大 导致size变大越界
- size = _ValidLength;
- if (Object->pValid + size > Object->pTail)//需要分成两段copy
- {
- int rest = Object->pTail - Object->pValid;
- memcpy(data, Object->pValid, rest);
- memcpy((char*)data + rest, Object->pHead, size - rest);//第二段,绕到整个存储区的开头
- Object->pValid = Object->pHead + size - rest;//更新已使用缓冲区的起始
- }
- else
- {
- memcpy(data, Object->pValid, size);
- Object->pValid = Object->pValid + size;
- if (Object->pValid == Object->pTail)
- Object->pValid = Object->pHead;
- }
- result = size;
- Object->pop_size += result;
- }
- // printf("pop = %s\n",(char*)data);
- return result;
- }
- int RingBuf_discard(RingBuf Object, int size)
- {
- int result = 0;
- if (size > 0 && Object->pop_size != Object->push_size)
- {
- int _ValidLength = Object->push_size - Object->pop_size;
- if (size > _ValidLength)//可能会push VALID_LEN变大 导致size变大越界
- size = _ValidLength;
- if (Object->pValid + size > Object->pTail)//需要分成两段copy
- {
- int rest = Object->pTail - Object->pValid;
- memset(Object->pValid, 0x00, rest);
- memset(Object->pHead, 0x00, size - rest);//第二段,绕到整个存储区的开头
- Object->pValid = Object->pHead + size - rest;//更新已使用缓冲区的起始
- }
- else
- {
- memset(Object->pValid, 0x00, size);
- Object->pValid = Object->pValid + size;
- if (Object->pValid == Object->pTail)
- Object->pValid = Object->pHead;
- }
- result = size;
- Object->pop_size += result;
- }
- // printf("pop = %s\n",(char*)data);
- return result;
- }
- uint32_t RingBuf_obj_num(RingBuf Object,int obj_size)
- {
- uint32_t obj_num = 0;
-
- obj_num = 0;
- if(Object->push_size > Object->pop_size)
- {
- obj_num = Object->push_size - Object->pop_size;
- obj_num = obj_num/obj_size;
- }
-
- return obj_num;
- }
|