代码中有相关注释:
// mybuf.h
#ifndef _RINGBUF_HEADER_
#define _RINGBUF_HEADER_
#ifdef _cplusplus
extern "C"{
#endif
/*************
1 === succeed
0 === failed
*************/
typedef struct _ringbuf_ ringbuf;
/******************
申请的缓冲的大小
size 为缓冲的大小
****************/
ringbuf* ringbuf_create(unsigned int size);
/*************
往缓冲中放数据
****************/
int ringbuf_push(ringbuf* pbuf,const void* data,int size);
/***************
从缓冲中取数据
*****************/
int ringbuf_pop(ringbuf* pbuf,void* data,int size);
/*************
从缓冲中取数据 但是不修改缓冲的大小
************/
void* ringbuf_top(ringbuf* pbuf,void* data,int size);
/*******************
移动缓冲的头指针
****************/
int ringbuf_head_move(ringbuf* pbuf,int size);
/***************
如果 size > 0 就是 上面的这个函数
其中size < 0 也是可以的
*************************/
int ringbuf_head_seek(ringbuf* pbuf,int size);
/***************
重新申请缓冲的大小
size 的大小是的最终大小
*******************/
ringbuf* ringbuf_realloc(ringbuf* pbuf,int size);
/*****************
获得buf的大小
******************/
int ringbuf_get_size(ringbuf* pbuf);
/***************
获得缓冲的开始
**************/
#if 1
void* ringbuf_get_head(ringbuf* pbuf);
/****************
获得当前缓冲的尾部
****************/
void* ringbuf_get_tail(ringbuf* pbuf);
/***************
销毁缓冲区
*********************/
void ringbuf_destroy(ringbuf* pbuf);
#endif
#ifdef _cplusplus
}
#endif
#endif
// mybuf.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include "mybuf.h"
#define RINGBUF_START(pbuf) ((unsigned char*)(pbuf->buf_start))
#define RINGBUF_END(pbuf) (pbuf->buf_start+pbuf->buf_size-1)
#define RINGBUF_HEAD(pbuf) (pbuf->buf_head)
#define RINGBUF_TAIL(pbuf) (pbuf->buf_tail)
#define RINGBUF_SIZE(pbuf) (pbuf->buf_size)
#define RINGBUF_USED(pbuf) (RINGBUF_HEAD(pbuf) <= RINGBUF_TAIL(pbuf) ? RINGBUF_TAIL(pbuf) - RINGBUF_HEAD(pbuf) : RINGBUF_SIZE(pbuf)+RINGBUF_TAIL(pbuf)-RINGBUF_HEAD(pbuf))
#define RINGBUF_FREE(pbuf) (RINGBUF_HEAD(pbuf) <= RINGBUF_TAIL(pbuf) ? RINGBUF_SIZE(pbuf)+RINGBUF_HEAD(pbuf) - RINGBUF_TAIL(pbuf) : RINGBUF_HEAD(pbuf) - RINGBUF_TAIL(pbuf))
struct _ringbuf_
{
pthread_mutex_t mutex;
unsigned int buf_size;
unsigned char* buf_head;
unsigned char* buf_tail;
unsigned char buf_start[1];
};
ringbuf* ringbuf_create(unsigned int size)
{
if(size > 0)
{
ringbuf *buf = malloc(sizeof(ringbuf) + size);
if(buf == NULL)
{
return NULL;
}
buf->buf_size = size;
buf->buf_head = buf->buf_tail = buf->buf_start;
pthread_mutex_init(&buf->mutex,NULL);
return buf;
}