loopbuf.h
typedef struct {
unsigned char stat;
#define LOOPBUF_STA_ALLOCED 0x01 // 内存是否已经分配
#define LOOPBUF_STA_ENDWRIT 0x02 // 写入是否完成
unsigned int size;
char *dat;
unsigned int ridx;
unsigned int widx;
} loopbuf_t;
void loopbuf_init(loopbuf_t *lbuf);
int loopbuf_alloc(loopbuf_t *lbuf, int size);
int loopbuf_alloc2(loopbuf_t *lbuf, int size, void *addr);
void loopbuf_free(loopbuf_t *lbuf);
void loopbuf_free2(loopbuf_t *lbuf);
int loopbuf_write(loopbuf_t *lbuf, void *dat, int len);
void loopbuf_write_end(loopbuf_t *lbuf);
bool loopbuf_write_is_end(loopbuf_t *lbuf);
int loopbuf_read(loopbuf_t *lbuf, void *dat, int len);
int loopbuf_get_size(loopbuf_t *lbuf);
unsigned loopadd(unsigned a, unsigned b, unsigned s);
unsigned loopsub(unsigned a, unsigned b, unsigned s);
loopbuf.c
void loopbuf_init(loopbuf_t *lbuf)
{
lbuf->stat = 0;
lbuf->dat = NULL;
}
int loopbuf_alloc(loopbuf_t *lbuf, int size)
{
if (!lbuf->dat) {
lbuf->dat = (char *)malloc(size);
if (!lbuf->dat)
return -ENOMEM;
}
lbuf->size = size;
lbuf->stat |= LOOPBUF_STA_ALLOCED;
return size;
}
int loopbuf_alloc2(loopbuf_t *lbuf, int size, void *addr)
{
if (!lbuf->dat)
lbuf->dat = addr;
lbuf->size = size;
lbuf->stat |= LOOPBUF_STA_ALLOCED;
return size;
}
void loopbuf_free(loopbuf_t *lbuf)
{
free(lbuf->dat);
lbuf->dat = NULL;
lbuf->stat = 0;
}
void loopbuf_free2(loopbuf_t *lbuf)
{
lbuf->dat = NULL;
lbuf->stat = 0;
}
void loopbuf_reset(loopbuf_t *lbuf)
{
lbuf->stat &= ~LOOPBUF_STA_ENDWRIT;
lbuf->widx = 0;
lbuf->ridx = 0;
}
int loopbuf_write(loopbuf_t *lbuf, void *dat, int len)
{
unsigned cnt;
unsigned ridx = lbuf->ridx;
unsigned cur_len;//当前可写的长度
if (lbuf->stat & LOOPBUF_STA_ENDWRIT)
return -ENOMEM;
if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
return -ENOMEM;
cur_len = loopsub(ridx, lbuf->widx, lbuf->size);
cur_len = loopsub(cur_len, 1, lbuf->size);
if (cur_len < len)
return -EBUSY;
cnt = lbuf->size - lbuf->widx;
if (len > cnt) {
memcpy(lbuf->dat + lbuf->widx, dat, cnt);
memcpy(lbuf->dat, (char *)dat + cnt, len - cnt);
} else
memcpy(lbuf->dat + lbuf->widx, dat, len);
lbuf->widx = (lbuf->widx + len) % lbuf->size;
return len;
}
void loopbuf_write_end(loopbuf_t *lbuf)
{
lbuf->stat |= LOOPBUF_STA_ENDWRIT;
}
bool loopbuf_write_is_end(loopbuf_t *lbuf)
{
if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
return -ENOMEM;
return (lbuf->stat & LOOPBUF_STA_ENDWRIT) ? 1 : 0;
}
int loopbuf_check(loopbuf_t *lbuf)
{
if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
return -ENOMEM;
return loopsub(lbuf->widx, lbuf->ridx, lbuf->size);
}
int loopbuf_read(loopbuf_t *lbuf, void *dat, int len)
{
unsigned cnt;
unsigned widx = lbuf->widx;
unsigned cur_len;
if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
return -ENOMEM;
cur_len = loopsub(widx, lbuf->ridx, lbuf->size);
if ((!cur_len) && (lbuf->stat & LOOPBUF_STA_ENDWRIT))
return 0;
if (cur_len < len) {
if (lbuf->stat & LOOPBUF_STA_ENDWRIT)
len = cur_len;
else
return -EBUSY;
}
cnt = lbuf->size - lbuf->ridx;
if (len > cnt) {
memcpy(dat, lbuf->dat + lbuf->ridx, cnt);
memcpy((char *)dat + cnt, lbuf->dat, len - cnt);
} else
memcpy(dat, lbuf->dat + lbuf->ridx, len);
lbuf->ridx = (lbuf->ridx + len) % lbuf->size;
return len;
}
int loopbuf_get_size(loopbuf_t *lbuf)
{
if (!(lbuf->stat & LOOPBUF_STA_ALLOCED))
return -ENOMEM;
return loopsub(lbuf->widx, lbuf->ridx, lbuf->size);
}
unsigned loopadd(unsigned a, unsigned b, unsigned s)
{
if ((a + b) > s)
return a + b -s;
else
return a + b;
}
unsigned loopsub(unsigned a, unsigned b, unsigned s)
{
if (a < b)
return a + s - b;
else
return a - b;
}
main.c
#define MY_EXCBUF_SIZE (32000)
static char my_excbuf[MY_EXCBUF_SIZE + 1];
loopbuf_t excbuf; // data exchange buffer
u8 tmp[MY_EXCBUF_SIZE+1] = { 0 };//写测试BUF
int _tmain(int argc, _TCHAR* argv[])
{
int ret;
memset(tmp, 5, 1000);
loopbuf_init(&excbuf);
if (loopbuf_alloc2(&excbuf, MY_EXCBUF_SIZE + 1, my_excbuf) < 0) {
ret = -1;
printf("loopbuf_alloc2 失败 ret = %d\r\n", ret);
}
ret = loopbuf_write(&excbuf, tmp, 1000);
printf("当前写入多少数据 ret = %d\r\n",ret);
if (ret < 0) {
printf("*");
}
ret = loopbuf_write(&excbuf, tmp, 1000);
printf("当前写入多少数据 ret = %d\r\n", ret);
if (ret < 0) {
printf("*");
}
ret = loopbuf_get_size(&excbuf);
printf("总共写入多少数据 ret1 = %d\r\n", ret);
system("Pause");
return 0;
}