没有实现长拷贝,写这个的目的是为了实现TCP数据流中提取帧
r_fifo.c
#include "r_fifo.h"
r_fifo *new_rfifo(int sizeof_e,int max_num)
{
uint8_t *buf = NULL;
r_fifo *r = NULL;
if(sizeof_e == 0 || max_num == 0)
return NULL;
r=malloc(sizeof(r_fifo));
buf=malloc(sizeof_e*(max_num));
if(r == NULL || buf == NULL){
free(r);
free(buf);
return NULL;
}
memset(r,0,sizeof(r_fifo));
r->in = 0;
r->out = 0;
r->sizeof_e = sizeof_e;
r->max_num = max_num;
r->buf = buf;
r->now_num=0;
return r;
}
r_fifo *new_rfifo1(int sizeof_e,int max_num,rfifo_lock lock,rfifo_unlock unlock)
{
uint8_t *buf = NULL;
r_fifo *r = NULL;
if(sizeof_e == 0 || max_num == 0)
return NULL;
r=malloc(sizeof(r_fifo));
buf=malloc(sizeof_e*(max_num));
if(r == NULL || buf == NULL){
free(r);
free(buf);
return NULL;
}
memset(r,0,sizeof(r_fifo));
r->in = 0;
r->out = 0;
r->sizeof_e = sizeof_e;
r->max_num = max_num;
r->buf = buf;
r->lock = lock;
r->unlock = unlock;
r->now_num=0;
return r;
}
void delete_rfifo(r_fifo *r)
{
METUX_LOCK(r);
free(r->buf);
free(r);
METUX_UNLOCK(r);
}
int in_rfifo(r_fifo *r,void *e)
{
if(r==NULL || e == NULL)
return -1;
if(r->now_num >= r->max_num)
return -2;
METUX_LOCK(r);
memcpy(r->buf + r->in*r->sizeof_e,e,r->sizeof_e);
r->in = (r->in < r->max_num-1) ? r->in +1 : 0;
r->now_num++;
M