一个好用的队列指针代码串口常用

一个好用的队列指针,不多逼逼上干货
.h文件代码

#ifndef __RING_H_
#define __RING_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum
{
	RING_GETS_FAILED = -6,
	RING_PUTS_FAILED = -5,
    RING_GET_FAILED = -4,
    RING_PUT_FAILED = -3,
    RING_RESET_FAILED = -2,
    RING_CREATE_FAILED = -1,
    RING_SCUCESS = 0,
};
//ring  structure
typedef struct
{
    int size;//the size of ring's effective capacity
    unsigned char* ptr_o;//origin address
    unsigned char* ptr_r;//next read address
    unsigned char* ptr_w;//next write address
    int count;//effective data count in ring now
}RB;
/**********funtions always use*************/
int ring_create(RB* r,unsigned char* buf,int size);
int ring_putchar(RB* r,unsigned char c);
int ring_getchar(RB* r,unsigned char* c);
int ring_puts(RB* r,unsigned char*buf,int buf_len);
int ring_gets(RB* r,unsigned char* buf,int len_tryto_read,int* len_actual_read);
/**********funtions may need*************/
int ring_reset(RB*r);
int ring_get_count(RB*r);
int ring_get_remain(RB* r);
int ring_is_empty(RB* r);
int ring_is_full(RB* r);
int ring_perror(char* fmt,int error);
#endif

.c文件代码

#include "ring.h"

int ring_create(RB* r,unsigned char* buf,int size)
{
    if(buf == NULL)return RING_CREATE_FAILED;
    r->ptr_o = buf;
    r->ptr_w = buf;
    r->ptr_r = buf;
    r->size  = size;
    r->count = 0;
    return RING_SCUCESS;
}

int ring_putchar(RB* r,unsigned char c)
{
    if(r->ptr_o==NULL)return RING_PUT_FAILED;
    if(ring_is_full(r)) return RING_PUT_FAILED;

	*(r->ptr_w) = c;
    if(r->ptr_w == (r->ptr_o + r->size-1))//at the top , jump to the origin address
    {
        r->ptr_w = r->ptr_o;
    }
    else
    {
        (r->ptr_w)++;
    }

    (r->count)++;
    return RING_SCUCESS;
}

int ring_getchar(RB* r,unsigned char* c)
{
    if(r->ptr_o==NULL)return RING_GET_FAILED;
    if(ring_is_empty(r))return RING_GET_FAILED;

    *c = *(r->ptr_r);
    r->count--;

    if(r->ptr_r == (r->ptr_o + r->size-1))
    {

        r->ptr_r = r->ptr_o;
    }
    else
    {
        (r->ptr_r)++;
    }
    return RING_SCUCESS;
}

int ring_puts(RB* r,unsigned char*buf,int buf_len)
{
	int remain;
	remain = ring_get_remain(r);
	if(remain <buf_len)return RING_PUTS_FAILED;
	while(buf_len)
	{
		if(ring_putchar(r,*buf)<0)
		{
			ring_perror("ring_putchar() ",RING_PUT_FAILED);
			return RING_PUTS_FAILED;
		}
		buf++;
		buf_len--;

	}
	return RING_SCUCESS;
}

int ring_gets(RB* r,unsigned char* buf,int len_tryto_read,int* len_actual_read)
{
	*len_actual_read =0;
	while(*len_actual_read <len_tryto_read)
	{
		if(ring_getchar(r,buf)<0)
		{
			ring_perror("ring_getchar() ",RING_GET_FAILED);
			return RING_GETS_FAILED;
		}
		(*len_actual_read)++;
		buf++;
	}

	return RING_SCUCESS;
}
/**********other functions may need**************/
int ring_reset(RB*r)
{
    if(r->ptr_o == NULL)
    {
//        printf("[error]need create ring first \n");
        return RING_RESET_FAILED;
    }

    r->ptr_w = r->ptr_o;
    r->ptr_r = r->ptr_o;
    r->count = 0;
    return RING_SCUCESS;
}
int ring_get_count(RB*r)
{
    return r->count;
}

int ring_get_remain(RB* r)
{
    return ((r->size)-(r->count));
}
int ring_is_empty(RB* r)
{
    return (r->count == 0)? 1:0;
}

int ring_is_full(RB* r)
{
    return (r->count >= r->size) ? 1:0;
}

int ring_perror(char* fmt,int error)
{
	char* str = (char*)malloc(128);
	memset(str,0,128);
	strcat(str,fmt);

	switch(error)
	{
		case RING_GETS_FAILED:
				strcat(str," [warning]  no so much data");
				break;
		case RING_PUTS_FAILED:
				strcat(str,"[error] no enough space to puts() in,should gets() out some data or ring_reset()");
				break;
		case RING_GET_FAILED:
				strcat(str," [warning]  ring empty");
				break;
		case RING_PUT_FAILED:
				strcat(str,"[error] ring is full");
				break;
		case RING_RESET_FAILED:
				strcat(str,"[error] ring not created");
				break;
		case RING_CREATE_FAILED:
				strcat(str,"[error] param error");
				break;
		case RING_SCUCESS:
				strcat(str,"RING_SCUCESS");
				break;
		default:
				strcat(str,"[warning] unknow error value");
				break;
	}
	fprintf(stdout,"%s \n",str);
	free(str);
	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值