初次提交,包含c语言实现的,cirbuff和varray

This commit is contained in:
forbelief 2016-11-20 23:31:59 -08:00
commit 64ad5e515e
9 changed files with 1178 additions and 0 deletions

330
c/cirbuff/cirbuff.c Normal file
View file

@ -0,0 +1,330 @@
/*
* cirbuff.c -
*
* 线
*/
#include <stdlib.h>
#include "cirbuff.h"
struct cirbuff
{
uint8_t *buff;
uint32_t rpos;
uint32_t wpos;
uint32_t size;
uint32_t cnt;
uint32_t update;
};
// 静态函数声明
static uint32_t cirbuff_cover_write(cirbuff_handle cbuff_h,
uint8_t *indata, uint32_t inlen);
static uint32_t cirbuff_nocover_write(cirbuff_handle cbuff_h,
uint8_t *indata, uint32_t inlen);
static uint32_t cirbuff_clear_read(cirbuff_handle cbuff_h,
uint8_t *outdata, uint32_t outlen);
static uint32_t cirbuff_noclear_read(cirbuff_handle cbuff_h,
uint8_t *outdata, uint32_t outlen);
// 以下函数为对循环缓冲区的操作
/*
* cirbuff_creat -
*
*
*/
cirbuff_handle cirbuff_creat(uint32_t size)
{
struct cirbuff *cbuff = NULL;
int32_t rlt = 0;
if (size == 0)
rlt = -1;
else
rlt = 1;
// 为cbuff分配空间
if (rlt)
{
cbuff = (struct cirbuff *)malloc(sizeof(*cbuff));
if (cbuff == NULL)
rlt = -2;
}
// 为cbuff->buff分配空间
if (rlt)
{
cbuff->buff = (uint8_t *)malloc(size);
if (cbuff->buff == NULL)
{
free(cbuff);
cbuff = NULL;
rlt = -2;
}
}
if (rlt)
{
cbuff->rpos = 0;
cbuff->wpos = 0;
cbuff->size = size;
cbuff->cnt = 0;
cbuff->update = 0;
}
return (cirbuff_handle)cbuff;
}
/*
* cirbuff_write -
* @cbuff:
* @indata:
* @inlen:
* @be_cover: 01
*
* buff满会循环覆盖先前已有的数据
* buff已满退
*/
uint32_t cirbuff_write(cirbuff_handle cbuff_h,
uint8_t *indata, uint32_t inlen, uint8_t be_cover)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
int32_t ret;
if (be_cover)
ret = cirbuff_cover_write(cbuff, indata, inlen);
else
ret = cirbuff_nocover_write(cbuff, indata, inlen);
return ret;
}
/*
* cirbuff_cover_write -
*
*
*/
static uint32_t cirbuff_cover_write(cirbuff_handle cbuff_h,
uint8_t *indata, uint32_t inlen)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
uint32_t i;
uint32_t cover_cnt = 0;
for (i = 0; i < inlen; i++)
{
cbuff->buff[cbuff->wpos] = indata[i];
// 更新状态
cbuff->wpos++;
if (cbuff->wpos == cbuff->size)
cbuff->wpos = 0;
// 是否存储区满
if (cirbuff_be_full(cbuff))
{
cbuff->rpos = cbuff->wpos;
cover_cnt++;
}
else
{
cbuff->cnt++;
}
}
if (i)
cbuff->update = 1;
return cover_cnt;
}
/*
* cirbuff_nocover_write -
*
*
*/
static uint32_t cirbuff_nocover_write(cirbuff_handle cbuff_h,
uint8_t *indata, uint32_t inlen)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
uint32_t i = 0;
while (i < inlen)
{
// 是否存储区满
if (cirbuff_be_full(cbuff))
break;
// 更新状态
cbuff->buff[cbuff->wpos++] = indata[i];
cbuff->cnt++;
if (cbuff->wpos == cbuff->size)
cbuff->wpos = 0;
i++;
}
if (i)
cbuff->update = 1;
return i;
}
/*
* cirbuff_clear_read -
*
* outdata可以为NULL
* outdata是否为NULL无关
*/
static uint32_t cirbuff_clear_read(cirbuff_handle cbuff_h,
uint8_t *outdata, uint32_t outlen)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
uint32_t i = 0;
while (i < outlen)
{
// 是否存储区空
if (cirbuff_be_empty(cbuff))
break;
if (outdata != NULL)
outdata[i] = cbuff->buff[cbuff->rpos];
// 更新状态
cbuff->cnt--;
cbuff->rpos++;
if (cbuff->rpos == cbuff->size)
cbuff->rpos = 0;
i++;
}
if (i)
cbuff->update = 0;
return i;
}
/*
* cirbuff_noclear_read -
*
* outdata可以为NULL
* outdata是否为NULL无关
*/
static uint32_t cirbuff_noclear_read(cirbuff_handle cbuff_h,
uint8_t *outdata, uint32_t outlen)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
uint32_t i = 0;
uint32_t cnt = cbuff->cnt;
uint32_t rpos = cbuff->rpos;
while (i < outlen)
{
// 是否存储区空
if (cirbuff_be_empty(cbuff))
break;
if (outdata != NULL)
outdata[i] = cbuff->buff[rpos];
// 更新状态
cnt--;
rpos++;
if (rpos == cbuff->size)
rpos = 0;
i++;
}
if (i)
cbuff->update = 0;
return i;
}
uint32_t cirbuff_read(cirbuff_handle cbuff_h,
uint8_t *outdata, uint32_t outlen, uint8_t be_clear)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
int32_t ret;
if (be_clear)
ret = cirbuff_clear_read(cbuff, outdata, outlen);
else
ret = cirbuff_noclear_read(cbuff, outdata, outlen);
return ret;
}
void cirbuff_revert(cirbuff_handle cbuff_h)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
cbuff->rpos = 0;
cbuff->wpos = 0;
cbuff->cnt = 0;
cbuff->update = 0;
return;
}
void cirbuff_destroy(cirbuff_handle cbuff_h)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
if (cbuff != NULL)
{
if (cbuff->buff != NULL)
free(cbuff->buff);
free(cbuff);
cbuff = NULL;
}
return;
}
// 以下函数为对循环缓冲区的查询
inline uint32_t cirbuff_be_empty(cirbuff_handle cbuff_h)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
return cbuff->cnt == 0 ? 1 : 0;
}
inline uint32_t cirbuff_be_full(cirbuff_handle cbuff_h)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
return cbuff->cnt == cbuff->size ? 1 : 0;
}
inline uint32_t cirbuff_data_num(cirbuff_handle cbuff_h)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
return cbuff->cnt;
}
inline uint32_t cirbuff_free_num(cirbuff_handle cbuff_h)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
return cbuff->size - cbuff->cnt;
}
inline uint32_t cirbuff_be_update(cirbuff_handle cbuff_h)
{
struct cirbuff *cbuff = (struct cirbuff *)cbuff_h;
return cbuff->update;
}

29
c/cirbuff/cirbuff.h Normal file
View file

@ -0,0 +1,29 @@
/*
* cirbuff.h -
*
* 线
*/
#include <stdint.h>
typedef void * cirbuff_handle;
// 对循环缓冲区的操作
cirbuff_handle cirbuff_creat(uint32_t size);
uint32_t cirbuff_write(cirbuff_handle cbuff_h,
uint8_t *indata, uint32_t inlen, uint8_t be_cover);
uint32_t cirbuff_read(cirbuff_handle cbuff_h,
uint8_t *outdata, uint32_t outlen, uint8_t beclear);
void cirbuff_revert(cirbuff_handle cbuff_h);
void cirbuff_destroy(cirbuff_handle cbuff_h);
// 对循环缓冲区的查询
uint32_t cirbuff_be_empty(cirbuff_handle cbuff_h);
uint32_t cirbuff_be_full(cirbuff_handle cbuff_h);
uint32_t cirbuff_data_num(cirbuff_handle cbuff_h);
uint32_t cirbuff_free_num(cirbuff_handle cbuff_h);
uint32_t cirbuff_be_update(cirbuff_handle cbuff_h);

9
c/cirbuff/cirbuff_test.c Normal file
View file

@ -0,0 +1,9 @@
/*
* cirbuff_test.c -
*/
int main(int argc, char const* argv[])
{
return 0;
}