#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
uint32_t RingBuf_Write(uint8_t *rbuf, uint32_t maxsize, uint32_t tail, uint8_t *src, uint32_t len)
{
uint8_t *buf1 = rbuf + tail;
int len1 = MIN(maxsize-tail, len);
uint8_t *buf2 = rbuf;
int len2 = len - len1;
memcpy(buf1, src + 0 , len1);
memcpy(buf2, src + len1, len2);
return len2 ? len2 : tail + len1;
}
uint32_t RingBuf_Read(uint8_t *rbuf, uint32_t maxsize, uint32_t head, uint8_t *dst, uint32_t len)
{
uint8_t *buf1 = rbuf + head;
int len1 = MIN(maxsize-head, len);
uint8_t *buf2 = rbuf;
int len2 = len - len1;
if (dst) memcpy(dst + 0 , buf1, len1);
if (dst) memcpy(dst + len1, buf2, len2);
return len2 ? len2 : head + len1;
}
int main(int argc, char *argv[]){
int maxsize = 4;
uint8_t * rbuf = malloc(maxsize);
int tail = 0;
uint8_t * src = "hello";
uint32_t len = strlen(src);
uint32_t out = RingBuf_Write(rbuf,maxsize,tail,src,len);
printf("out:%d
",out);
printf("rbuf:%s
",rbuf);
printf("---------
");
int head = 0;
uint8_t *dst = malloc(8);
uint32_t ret = RingBuf_Read(rbuf,maxsize,head,dst,2);
printf("ret:%d
",ret);
printf("dst:%s
",dst);
return 0;
}
摘录自:https://github.com/rockcarry/ffrdp