/****************************************************************************** 版权所有 (C), 2018-2099, Radkil_Std ****************************************************************************** 文 件 名 : ringbuffer.h 版 本 号 : 初稿 作 者 : Radkil 生成日期 : 2023年3月26日 最近修改 : 功能描述 : ringbuffer.c 的头文件 修改历史 : 1.日 期 : 2023年3月26日 作 者 : Radkil 修改内容 : 创建文件 ******************************************************************************/ /*----------------------------------------------* * 外部变量说明 * *----------------------------------------------*/ /*----------------------------------------------* * 外部函数原型说明 * *----------------------------------------------*/ /*----------------------------------------------* * 内部函数原型说明 * *----------------------------------------------*/ /*----------------------------------------------* * 全局变量 * *----------------------------------------------*/ /*----------------------------------------------* * 模块级变量 * *----------------------------------------------*/ /*----------------------------------------------* * 常量定义 * *----------------------------------------------*/ /*----------------------------------------------* * 宏定义 * *----------------------------------------------*/ #ifndef __RINGBUFFER_H__ #define __RINGBUFFER_H__ #ifdef __cplusplus #if __cplusplus extern "C"{ #endif #endif /* __cplusplus */ /*==============================================* * include header files * *----------------------------------------------*/ #include #include "common.h" /*==============================================* * constants or macros define * *----------------------------------------------*/ typedef struct TRingBuffer rd_ringbuf_t; struct TRingBuffer { unsigned short m_bReadMirror : 1; unsigned short m_sReadIndex : 15; unsigned short m_bWriteMirror : 1; unsigned short m_sWriteIndex : 15; int m_iBufsize; char *m_pcBufPtr; }; enum ERingBufState { RINGBUFFER_EMPTY, RINGBUFFER_FULL, RINGBUFFER_HALFFULL, }; int rd_RingbufferDataLen(rd_ringbuf_t *rb); /** * @brief Get the buffer size of the ring buffer object. * * @param rb A pointer to the ring buffer object. * * @return Buffer size. */ rd_inline int rd_RingbufferGetSize(rd_ringbuf_t *rb) { if(NULL == rb) { return -1; } return rb->m_iBufsize; } rd_inline enum ERingBufState rd_RingbufferStatus(rd_ringbuf_t *rb) { if (rb->m_sReadIndex == rb->m_sWriteIndex) { if (rb->m_bReadMirror == rb->m_bWriteMirror) return RINGBUFFER_EMPTY; else return RINGBUFFER_FULL; } return RINGBUFFER_HALFFULL; } /** return the size of empty space in rb */ #define rd_RingbufferSpaceLen(rb) ((rb)->m_iBufsize - rd_RingbufferDataLen(rb)) /*==============================================* * project-wide global variables * *----------------------------------------------*/ /*==============================================* * routines' or functions' implementations * *----------------------------------------------*/ extern rd_ringbuf_t *rd_RingbufferCreate(int size); extern int rd_RingbufferDataLen(rd_ringbuf_t *rb); extern void rd_RingbufferDestroy(rd_ringbuf_t *rb); extern int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length); extern int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch); extern void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size); extern int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr); extern int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length); extern int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch); extern int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch); extern int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length); extern void rd_RingbufferReset(rd_ringbuf_t *rb); #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* __RINGBUFFER_H__ */