#define DB_FILENAME     "HOME/DataBaseDemo.BIN"
#define DB_MAX_ACCT     100
#define DB_ACCT_BLKS    1

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


U0 InitDatabase()
{
  LTFile *f;
  //Write new contiguous file
  f=FOpen(DB_FILENAME,"w",DB_MAX_ACCT*DB_ACCT_BLKS);
  FClose(f);
}


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

  acctnum=PmtI64("Acct #",-1);
  if (0<=acctnum<DB_MAX_ACCT) {
    MemSet(&a,0,BLK_SIZE);
    if (LtfFormDo(&a,"Acct")) {
      f=FOpen(DB_FILENAME,"w+");
      FWBlks(f,&a,acctnum*DB_ACCT_BLKS,DB_ACCT_BLKS);
      FClose(f);
    }
  }
}

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

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

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

DatabaseDemo;