#include <stdio.h>

 

 

#ifndef BYTE

#define BYTE unsigned char

#define WORD unsigned short

#define DWORD unsigned long

#define BOOL BYTE

#define TRUE 1

#define FALSE 0

#endif

 

#include "bag.h"

 

 

#define MAX_POOL 512

static BYTE Pool[MAX_POOL];

static int PoolSize=MAX_POOL-5;  //Could be 512, but to reduce possibility of various

                                 //off-by errors that could crash the system, make it less.

                                 //You don't have to do this, but I like margins of safety.

 

static BYTE* pWorkingPool;

static int WorkingPoolSize;

 

BOOL BAG_ClearAll(void)

{

 int j;

 

 for (j=0;j<WorkingPoolSize;j++) pWorkingPool[j]=BAG_EOL;

 return(TRUE);

}

 

 

BOOL BAG_Init()

{

 pWorkingPool=&Pool[0];

 WorkingPoolSize=PoolSize;

 

 

 BAG_ClearAll(); //Start with an empty bag.

 

 printf("TODO: Read bag structure from nonvolatile storage...\r\n");

 //TODO: Read the bag structure from a disk file, flash, or battery backed RAM.

 

 return(TRUE);

}

 

 

 

BOOL BAG_Save(void)

{

 printf("TODO: Save bag to nonvolatile storage...\r\n");

 //TODO: Write the bag structure to a disk file, flash, or battery backed RAM.

 return(TRUE);

}

 

 

 

 

BOOL BAG_DelTag(BYTE Tag)

{

 int Index1,Index2;

 BYTE k,j;

 BYTE TempPool[MAX_POOL];

 int r;

 

 Index1=0;

 Index2=0;

 for (r=0;r<sizeof(TempPool);r++) TempPool[r]=BAG_EOL;

 while (1)

  {

   if (pWorkingPool[Index1]==BAG_EOL)

    {

     for (r=0;r<WorkingPoolSize;r++) pWorkingPool[r]=TempPool[r];

     return(TRUE);

    }

 

   if (pWorkingPool[Index1]==Tag)

    {

     Index1++;

     k=pWorkingPool[Index1];

     Index1+=k;

     Index1++;

    }

   else

    {

     TempPool[Index2]=pWorkingPool[Index1];

     Index1++;

     Index2++;

     k=pWorkingPool[Index1];

     TempPool[Index2]=k;

     Index1++;

     Index2++;

     for (j=0;j<k;j++) TempPool[Index2+j]=pWorkingPool[Index1+j];

     Index1+=k;

     Index2+=k;

    }

  }

 

 return(TRUE);

}

 

 

BOOL BAG_PutTag(BYTE Tag,void* Buf,BYTE Len)

{

 int Index;

 BYTE k,j;

 BYTE* pByte;

 

 //Erase the existing value, if present.

 BAG_DelTag(Tag); 

 

 //Now save the new value.

 pByte=(BYTE*)Buf;

 Index=0;

 while (1)

  {

   if (pWorkingPool[Index]==BAG_EOL)

    {

     pWorkingPool[Index]=Tag;

     Index++;

     pWorkingPool[Index]=Len;

     Index++;

     for (j=0;j<Len;j++) pWorkingPool[Index+j]=pByte[j];

     return(TRUE);

    }

   else

    {

     Index++;           //Increment to data length

     k=pWorkingPool[Index];  //Get it.

     Index+=k;          //Increment over data portion

     Index++;           //Point to next tag

    }

  }

 

 return(TRUE);

}

 

 

BOOL BAG_GetTag(BYTE Tag,void* Buf,BYTE BufLen)

{

 int Index;

 BYTE k,j;

 BYTE* pByte;

 

 

 pByte=(BYTE*)Buf;

 Index=0;

 while (1)

  {

   if (pWorkingPool[Index]==BAG_EOL) return(FALSE);

   if (pWorkingPool[Index]==Tag)

    {

     Index++;

     k=pWorkingPool[Index];

     Index++;

     for (j=0;j<k;j++)

      {

       if (j<BufLen) pByte[j]=pWorkingPool[Index+j];

      }

     return(TRUE);

    }

   else

    {

     Index++;

     k=pWorkingPool[Index];

     Index+=k;

     Index++;

    }

 

  }

 

 return(TRUE);

}