U0 BgtDataRead()
{
  CBgtEntry     *tmpb;
  CBgtTemplate  *tmpt;
  I64           i,cnt,size;
  U8            *b,*ptr;
  I64           max_num;
  U8            **s=StrFileRead(bgt_string_file,&max_num);

  MemSet(&b_head,0,sizeof(CBgtEntry));
  QueInit(&b_head);
  b_head.date=Now;
  MemSet(&t_head,0,sizeof(CBgtTemplate));
  QueInit(&t_head);
  t_head.b.date=Now;

  if (ptr=b=FileRead(bgt_data_file,&size)) {
    cnt=*ptr(I64 *)++;
    for (i=0;i<cnt;i++) {
      tmpb=CAlloc(sizeof(CBgtEntry));
      MemCpy(&tmpb->start,ptr,BE_SIZE);
      tmpb->credit=StrNew(s[tmpb->credit_idx]);
      tmpb->debit =StrNew(s[tmpb->debit_idx]);
      tmpb->desc  =StrNew(s[tmpb->desc_idx]);
      QueIns(tmpb,b_head.last);
      ptr+=BE_SIZE;
    }

    cnt=*ptr(I64 *)++;
    for (i=0;i<cnt;i++) {
      tmpt=CAlloc(sizeof(CBgtTemplate));
      MemCpy(&tmpt->start,ptr,BT_SIZE);
      ptr+=BT_SIZE;
      MemCpy(&tmpt->b.start,ptr,BE_SIZE);
      ptr+=BE_SIZE;
      tmpt->b.credit=StrNew(s[tmpt->b.credit_idx]);
      tmpt->b.debit =StrNew(s[tmpt->b.debit_idx]);
      tmpt->b.desc  =StrNew(s[tmpt->b.desc_idx]);
      QueIns(tmpt,t_head.last);
    }
  }

  StrFileArrDel(s,max_num);
  Free(b);

  BgtAcctsUpdate;
}

U0 BgtDataWrite()
{
  I64 i,num=0,size,cnt1,cnt2;
  CHashTable    *table=HashTableNew(1024);
  CBgtEntry     *tmpb;
  CBgtTemplate  *tmpt;
  CHashGeneric *tmph;
  U8 *buf,*ptr;

  for (i=0;i<=accts_table->mask;i++) {
    tmph=accts_table->body[i];
    while (tmph) {
      StrFileAdd(tmph->str,&num,table); //Cosmetics -- make accts appear first.
      tmph=tmph->next;
    }
  }

  tmpb=b_head.next;
  cnt1=0;
  while (tmpb!=&b_head) {
    if (tmpb->type!=BE_TEMPLATE_COPY) {
      tmpb->credit_idx  =StrFileAdd(tmpb->credit,&num,table);
      tmpb->debit_idx   =StrFileAdd(tmpb->debit,&num,table);
      tmpb->desc_idx            =StrFileAdd(tmpb->desc,&num,table);
      cnt1++;
    }
    tmpb=tmpb->next;
  }

  tmpt=t_head.next;
  cnt2=0;
  while (tmpt!=&t_head) {
    tmpt->b.credit_idx  =StrFileAdd(tmpt->b.credit,&num,table);
    tmpt->b.debit_idx   =StrFileAdd(tmpt->b.debit,&num,table);
    tmpt->b.desc_idx            =StrFileAdd(tmpt->b.desc,&num,table);
    cnt2++;
    tmpt=tmpt->next;
  }
  StrFileWrite(bgt_string_file,table);
  StrFileDel(table);

  size=sizeof(I64)*2+cnt1*BE_SIZE+cnt2*(BT_SIZE+BE_SIZE);
  buf=ptr=MAlloc(size);

  MemCpy(ptr,&cnt1,sizeof(I64));
  ptr+=sizeof(I64);
  tmpb=b_head.next;
  while (tmpb!=&b_head) {
    if (tmpb->type!=BE_TEMPLATE_COPY) {
      MemCpy(ptr,&tmpb->start,BE_SIZE);
      ptr+=BE_SIZE;
    }
    tmpb=tmpb->next;
  }

  MemCpy(ptr,&cnt2,sizeof(I64));
  ptr+=sizeof(I64);
  tmpt=t_head.next;
  while (tmpt!=&t_head) {
    MemCpy(ptr,&tmpt->start,BT_SIZE);
    ptr+=BT_SIZE;
    MemCpy(ptr,&tmpt->b.start,BE_SIZE);
    ptr+=BE_SIZE;
    tmpt=tmpt->next;
  }

  FileWrite(bgt_data_file,buf,size);
  Free(buf);
}

U0 BgtDel()
{
  CBgtEntry     *tmpb,*tmpb1;
  CBgtTemplate  *tmpt,*tmpt1;
  tmpb=b_head.next;
  while (tmpb!=&b_head) {
    tmpb1=tmpb->next;
    BgtEntryDel2(tmpb);
    Free(tmpb);
    tmpb=tmpb1;
  }
  tmpt=t_head.next;
  while (tmpt!=&t_head) {
    tmpt1=tmpt->next;
    BgtEntryDel2(&tmpt->b);
    Free(tmpt);
    tmpt=tmpt1;
  }
  StrFileDel(accts_table);
  accts_table=NULL;
  accts_table_strs=0;
}