Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42865
  • 博文数量: 27
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-19 12:09
文章分类
文章存档

2012年(27)

我的朋友

分类:

2012-10-31 11:02:15

ringq.c

这个模块是一个环回的队列存储模块。

/*

 *    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) – 1rq->endbuf - rq->endp

-----------------------------------------------------------------------------------------------------------------

 

int ringqGetBlkMax(ringq_t *rq)

功能:范围endp-servpendbuf-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的多少次幂

-----------------------------------------------------------------------------------------------------------------
阅读(543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~