Skip to content
Snippets Groups Projects
buffer.c 1.86 KiB
Newer Older
#include <buffer.h>
Tom Feng's avatar
Tom Feng committed
#include <bwio.h>
#include <error.h>
#include <types.h>

int BufferReady(Buffer* Buf){
  int ready = ((Buf!=NULL) &&(Buf->Size >0))? 1:0;
  return ready;
}


int FeedBuffer(Buffer* Buf,void* Word)
{
  if(BufferReady(Buf)){
    if(Buf->Length == Buf->Size) return BUFF_FULL;
Tom Feng's avatar
Tom Feng committed
    int* Store = (int *)(Buf->Storage);
    Store[Buf->Tail] = (int)Word;
    Buf->Tail = (Buf->Tail + 1) % (Buf->Size);
    Buf->Length = Buf->Length + 1;
    return 0;
  }else return BUFF_NOTREADY;
}

int BufferFIFO(Buffer* Buf,void* Dest)
{
  if(BufferReady(Buf)){
    if(Buf->Length == 0) return BUFF_EMPTY;
Tom Feng's avatar
Tom Feng committed
    int* Store = (int *)(Buf->Storage);
    *(int *)Dest = Store[Buf->Head];
    return 0;
  }else return BUFF_NOTREADY;
}
int BufferPopHead(Buffer* Buf)
{
Tom Feng's avatar
Tom Feng committed
  //bwprintf(COM2,"BufferPopHead: Buf is %d\n\r",Buf);
  if(BufferReady(Buf)){
    if(Buf->Length == 0) return BUFF_EMPTY;
    Buf->Head = (Buf->Head +1) % Buf->Size;
    Buf->Length = (Buf->Length) - 1;
    return 0;
  }else return BUFF_NOTREADY;
}

int BufferFILO(Buffer* Buf, void* Dest)
{
  if(Buf->Size == 0) return  BUFF_NOTREADY;
  if(Buf->Length == 0) return BUFF_EMPTY;
Tom Feng's avatar
Tom Feng committed
  int* Store = (int *)(Buf->Storage);
  *(int *)Dest = Store[Buf->Tail];
  return 0;
}

int BufferPopLast(Buffer* Buf)
{
  if(BufferReady(Buf)){
    if(Buf->Length == 0) return BUFF_EMPTY;
    Buf->Tail = (Buf->Tail - 1 + Buf->Size) % Buf->Size;
    Buf->Length = (Buf->Length) - 1;
    return 0;
  }else return BUFF_NOTREADY;
}

int ClearBuffer(Buffer* Buf)
{
  if(BufferReady(Buf)){
    Buf->Length = 0;
    Buf->Tail = Buf->Head;
    return 0;
  }else return BUFF_NOTREADY;
}

int BufferShrinkFIFO(Buffer* Buf, int Num)
{
  if(BufferReady(Buf)){
    int ActualShrink = (Num > Buf->Length)? (Buf->Length): Num;
    Buf->Length = Buf->Length - ActualShrink;
    Buf->Head = (Buf->Head + ActualShrink) % Buf->Size;
    return 0;
  }else return BUFF_NOTREADY;