2012年(27)
分类:
2012-10-31 11:02:15
这个模块是一个环回的队列存储模块。
/*
* Ring queue buffer structure
*/
typedef struct {
unsigned char *buf; /* Holding buffer for data */
unsigned char *servp; /* Pointer to start of data */
unsigned char *endp; /* Pointer to end of data */
unsigned char *endbuf; /* Pointer to end of buffer */
int buflen; /* Length of ring queue */
int maxsize; /* Maximum size */
int increment; /* Growth increment */
} ringq_t;
Servp:指向数据开始。
Endp:指向数据的结束的后一个字节。
Buf:指向buf开始
Endbuf:指向buf的结束的后一个字节。
这个模块就是一个buf环,当servp等于endp时,代表buf是空的,没有数据。
int ringqOpen(ringq_t *rq, int initSize, int maxsize)
功能:建立一个环形buf
说明:大小是initSize,最大可扩展为maxsize。
-----------------------------------------------------------------------------------------------------------------
void ringqClose(ringq_t *rq)
功能:关闭buf环,释放内存。
说明:
-----------------------------------------------------------------------------------------------------------------
int ringqLen(ringq_t *rq)
功能:计算buf环中有多少数据
说明:
由于是buf环,所以数据开始的地址servp可能大于数据结束的地址endp,所以需要加上一个buf环的长度。
-----------------------------------------------------------------------------------------------------------------
int ringqGetc(ringq_t *rq)
功能:从buf环中数据头部移走一个字符。
说明:是从servp开始移走的,所以servp要加1.
-----------------------------------------------------------------------------------------------------------------
int ringqPutc(ringq_t *rq, char_t c)
功能:向buf环中数据尾部添加一个字符
说明:endp要加1.
-----------------------------------------------------------------------------------------------------------------
int ringqInsertc(ringq_t *rq, char_t c)
功能:在数据头部插入一个字符
说明:
-----------------------------------------------------------------------------------------------------------------
int ringqPutStr(ringq_t *rq, char_t *str)
功能:向buf中添加一字符串。
说明:
-----------------------------------------------------------------------------------------------------------------
int ringqPutBlk(ringq_t *rq, unsigned char *buf, int size)
功能:向buf拷贝一块数据,使用的是memcpy,所以只能是直线拷贝,不能打环了。
说明:使用ringqPutBlkMax来获得能拷贝多少直线拷贝数据,不够的话,扩展buf
-----------------------------------------------------------------------------------------------------------------
int ringqGetBlk(ringq_t *rq, unsigned char *buf, int size)
功能:从buf拷贝一块数据,也是memcpy,直线拷贝。
说明:使用ringqGetBlkMax来获得能拷贝多少直线拷贝数据
-----------------------------------------------------------------------------------------------------------------
int ringqPutBlkMax(ringq_t *rq)
功能:也是返回两个值中的最小值。
说明:rq->buflen - RINGQ_LEN(rq) – 1与rq->endbuf - rq->endp
-----------------------------------------------------------------------------------------------------------------
int ringqGetBlkMax(ringq_t *rq)
功能:范围endp-servp与endbuf-servp的最小值
说明:
-----------------------------------------------------------------------------------------------------------------
void ringqPutBlkAdj(ringq_t *rq, int size)
功能:向buf添加数据,调整endp。
说明:endp是加的方向。
-----------------------------------------------------------------------------------------------------------------
void ringqGetBlkAdj(ringq_t *rq, int size)
功能:从buf中考走数据后,调整servp
说明:servp是加的方向。
-----------------------------------------------------------------------------------------------------------------
void ringqFlush(ringq_t *rq)
功能:清除环回buf中的数据
说明:即servp等于endp
-----------------------------------------------------------------------------------------------------------------
static int ringqGrow(ringq_t *rq)
功能:扩展环回buf的大小
说明:
-----------------------------------------------------------------------------------------------------------------
static int getBinBlockSize(int size)
功能:获得size的块的大小
说明:块的大小必须是2的多少次幂
-----------------------------------------------------------------------------------------------------------------