C语言环形队列代码,先入先出

该程序不依赖任何外部代码,只有ringbuf.c,ringbuf.h两个文件。
c语言环形队列代码,先入先出。

ringbuf.h

/**********************************
 * @file ringbuf.h
 * @author yujinjiang
 * @date 2024.1.10
 * *******************************/

#ifndef __RING_BUF_H_
#define __RING_BUF_H_

#include "stdint.h"

typedef struct
{
    uint8_t *buf;
    int32_t wp;
    int32_t rp;
    int32_t size;
    int32_t freesize;
}ringbuf_t;

uint8_t ringbuf_isEmpty(ringbuf_t *ringbuf);

void ringbuf_init(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf);

//return 0:false 1:success
uint8_t ringbuf_read(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf);

//return 0:false 1:success
uint8_t ringbuf_write(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf);

uint32_t ringbuf_data_size_get(ringbuf_t *ringbuf);

uint32_t ringbuf_free_size_get(ringbuf_t *ringbuf);

void ringbuf_clear(ringbuf_t *ringbuf);

#endif



ringbuf.c

/**********************************
 * @file ringbuf.c
 * @author yujinjiang
 * @date 2024.1.10
 * *******************************/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "ringbuf.h"

#define RINGBUF_DEBUG_EN (0)

uint8_t ringbuf_isEmpty(ringbuf_t *ringbuf)
{
    if(ringbuf->freesize == ringbuf->size){
        ringbuf_clear(ringbuf);
        return 1;
    }
    else{
        return 0;
    }
}

void ringbuf_init(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf)
{
    memset(buf,0,size_byte);
    ringbuf->buf = buf;
    ringbuf->wp = 0;
    ringbuf->rp = 0;
    ringbuf->size = size_byte;
    ringbuf->freesize = ringbuf->size;
}

uint8_t ringbuf_read(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf)
{
    uint8_t *pbuf = (uint8_t*)ringbuf->buf;
    uint32_t size = ringbuf->size;
    if(ringbuf_isEmpty(ringbuf)){
#if RINGBUF_DEBUG_EN
        printf("read false : buffer null!!\n");
#endif
        return 0;
    }
    if(size_byte > ringbuf_data_size_get(ringbuf)){
        return 0;
    }

    if(ringbuf->wp >= ringbuf->rp){
        memcpy(buf,&ringbuf->buf[ringbuf->rp],size_byte);
        ringbuf->rp += size_byte;
    }
    else{
        memcpy(buf,&pbuf[ringbuf->rp],size - ringbuf->rp);
        memcpy(&buf[size - ringbuf->rp],pbuf,size_byte - (size - ringbuf->rp));
        ringbuf->rp = size_byte - (size - ringbuf->rp);
    }
    ringbuf->freesize += size_byte;

    return 1;
}

uint8_t ringbuf_write(uint8_t *buf,uint32_t size_byte,ringbuf_t *ringbuf)
{
    uint8_t *pbuf = (uint8_t*)ringbuf->buf;
    uint32_t size = ringbuf->size;
    if(ringbuf_free_size_get(ringbuf) < size_byte){
#if RINGBUF_DEBUG_EN
        printf("write false: buffer full!\n");
#endif
        return 0;
    }
    if(ringbuf_isEmpty(ringbuf)){
        memcpy(pbuf,buf,size_byte);
        ringbuf->wp = size_byte;
        ringbuf->freesize -= size_byte;
        return 1;
    }
    if(size - ringbuf->wp >= size_byte){
        memcpy(&pbuf[ringbuf->wp],buf,size_byte);
        ringbuf->wp += size_byte;
    }
    else{
        memcpy(&pbuf[ringbuf->wp],buf,size - ringbuf->wp);
        memcpy(&pbuf[0],&buf[size - ringbuf->wp],size_byte - (size - ringbuf->wp));
        ringbuf->wp = size_byte - (size - ringbuf->wp);
    }
    if(ringbuf->wp == ringbuf->size){
        ringbuf->wp = 0;
    }
    ringbuf->freesize -= size_byte;
    return 1;
}

uint32_t ringbuf_data_size_get(ringbuf_t *ringbuf)
{
    uint32_t reg = 0;
    if(ringbuf_isEmpty(ringbuf)){
        return 0;
    }
    else{
        reg = ringbuf->size - ringbuf->freesize;
    }
    return reg;
}

uint32_t ringbuf_free_size_get(ringbuf_t *ringbuf)
{
    return ringbuf->freesize;
}

void ringbuf_clear(ringbuf_t *ringbuf)
{
    ringbuf->wp = 0;
    ringbuf->rp = 0;
    ringbuf->freesize = ringbuf->size;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值