#define DB_FILENAME 		"~/DataBaseDemo.BIN"
#define DB_ACCT_MAX 		100
#define DB_ACCT_BLKS		1

class Acct
{//Use <CTRL-l> to help generate formats.
	U8 name[32] format "$$DA-P,LEN=32,A=\"Name:%s\"$$\n";
	U8 addr[64] format "$$DA-P,LEN=64,A=\"Addr:%s\"$$\n";
	U8 pad[DB_ACCT_BLKS * BLK_SIZE - 64 - 32];
};

U0 InitDatabase()
{ //Write new contiguous file
	CFile *f = FOpen(DB_FILENAME, "w", DB_ACCT_MAX * DB_ACCT_BLKS);

	FClose(f);
}

U0 WriteAcct()
{
	CFile	*f;
	Acct	 a;
	I64		 acctnum;

	acctnum = I64Get("Acct #", -1);
	if (0 <= acctnum < DB_ACCT_MAX)
	{
		MemSet(&a, 0, BLK_SIZE);
		if (DocForm(&a))
		{
			f = FOpen(DB_FILENAME, "w+");
			FBlkWrite(f, &a, acctnum * DB_ACCT_BLKS, DB_ACCT_BLKS);
			FClose(f);
		}
	}
}

U0 ReadAcct()
{
	CFile	*f;
	Acct	 a;
	I64		 acctnum;

	acctnum = I64Get("Acct #", -1);
	if (0 <= acctnum < DB_ACCT_MAX)
	{
		f = FOpen(DB_FILENAME, "r");
		FBlkRead(f, &a, acctnum * DB_ACCT_BLKS, DB_ACCT_BLKS);
		FClose(f);
		ClassRep(&a);
	}
}

U0 DatabaseDemo()
{
	I64 ch;

	if (!FileFind(DB_FILENAME))
		InitDatabase;
	do
	{
		"$$GREEN$$R$$FG$$ead acct, $$GREEN$$W$$FG$$rite acct or $$GREEN$$<SHIFT-ESC>$$FG$$:";
		ch = ToUpper(CharGet);
		'\n';
		if (ch == 'R') ReadAcct;
		if (ch == 'W') WriteAcct;
	}
	while (ch != CH_SHIFT_ESC && ch != CH_ESC);
}

DatabaseDemo;
