2014年4月21日 星期一

circular buffer , ring buffer source code




#include <stdlib.h>
#include <stdio.h>
/*
Rb:ring buffer
*/

void help(void)
{
 printf("format: ring_buffer buffer_size\n");
}

typedef struct
{
 int data;
}MyData;

#define true 1
#define false 0
#define success 1
#define fail 0

typedef struct{
 int size;
 int start;
 int end;
 MyData *data;
}Rb;

bool RbInit(Rb *RbPtr , int RbSize)
{
 if(NULL == (RbPtr->data = (MyData *)calloc(RbSize ,sizeof(Rb))))
 {
  printf("calloc memory fail\n");
  return fail;
 }
 
 RbPtr->size = RbSize;
 RbPtr->start = 0;
 RbPtr->end = 0;
 return success;
}

bool RbDestroy(Rb *RbPtr)
{
 free(RbPtr->data);
 return success;
}

bool RbIsFull(Rb *RbPtr)
{
 if(0 == RbPtr->start){
  if((RbPtr->size-1) == RbPtr->end){
   return true;
  }
 }else{
  if( (RbPtr->start - 1) == RbPtr->end){
   return true;
  }
 }
 
 return false;
}

bool RbIsEmpty(Rb *RbPtr)
{
 if(RbPtr->end == RbPtr->start ){
  return true;
 }
 
 return false;
}

bool RbWriteData(Rb *RbPtr , MyData *data)
{
 if(true == RbIsFull(RbPtr)){
  return fail;
 }

 RbPtr->data[RbPtr->end] = *data;

 RbPtr->end++;
 if(RbPtr->end >= RbPtr->size){
  RbPtr->end = 0;
 }
 return success;
}

bool RbReadData(Rb *RbPtr , MyData *data)
{
 if(true == RbIsEmpty(RbPtr)){
  return fail;
 }

 *data = RbPtr->data[RbPtr->start];

 RbPtr->start++;
 if(RbPtr->start >= RbPtr->size){
  RbPtr->start = 0;
 }
 
 return success;
}

int RbDataNum(Rb *RbPtr)
{
 if(true == RbIsEmpty(RbPtr)){
  return 0;
 }else if(true == RbIsFull(RbPtr)){
  return (RbPtr->size - 1);
 }else{
  if(RbPtr->start > RbPtr->end){
   return (RbPtr->end + RbPtr->size - RbPtr->start);
  }else{
   return (RbPtr->end - RbPtr->start);
  }
 }
}

int main(int argc, char* argv[])
{
 int RbSize , i=0;
 Rb Buffer;
 MyData data;
 
 if(2 != argc){
  help();
  return fail;
 }

 RbSize = atoi(argv[1]);

 RbInit(&Buffer , RbSize);
 
 //only write
 #if 0
 printf("===step1 only write===\n");
 for(i=0 ;i<RbSize+1 ;i++){
  if(false == RbIsFull(&Buffer)){ 
   data.data = i;
   RbWriteData(&Buffer , &data);
  }else{
   break;
  }
 }

 printf("Rb data number=%d\n",RbDataNum(&Buffer));
 for(i=0 ;i<RbSize ;i++){
  printf("Rb_%d:%d\n",i , Buffer.data[i].data);
 }
 #endif

 //write , read
 printf("===step2 write read===\n");
 for(i=0 ;i<RbSize+3 ;i++){
  if(false == RbIsFull(&Buffer)){ 
   data.data = i;
   RbWriteData(&Buffer , &data);
  }else{
   break;
  }
  
  if(0 == (i%3)){
   RbReadData(&Buffer , &data);
   printf("@@@ cb read data = %d\n",data.data);
  }
 }

 printf("Rb data number=%d  start=%d  end=%d\n",RbDataNum(&Buffer) ,Buffer.start , Buffer.end);
 for(i=0 ;i<RbSize ;i++){
  printf("Rb_%d:%d\n",i , Buffer.data[i].data);
 }

 RbDestroy(&Buffer);

 return success;
}




我只會這種寫法,加減用吧.
下載:
https://drive.google.com/file/d/0B8hm-I2M8BD7OGd0NVl4Ny0zWTg/edit?usp=sharing

沒有留言:

張貼留言