#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);
}